c++ - 使用 nullptr 而不是结束迭代器

标签 c++ stl

我想知道是否可以使用 nullptr 或某种通用的结束迭代器。

例如:

// a.b->cdef().g->bdf() is a std::map<int, int>
std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin(), a.b->cdef().g->bdf().end());

是您通常编写的用于指定开始和结束以初始化新 map 的内容。

如果我只想复制整个 map ,为什么需要指定结束标记。

我更喜欢这样的东西:

std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin(), nullptr);

std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin());

std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin(), std::unordered_map::end);

编辑:我将示例从 std::list 更改为 std::unordered_map。没有从 std::map 到 std::unordered_map 的复制构造函数。

最佳答案

回答问题“是否可以使用 nullptr 而不是 end()?”

没有。

请思考容器和迭代器是如何实现的。容器知道它的开始和结束迭代器。迭代器知道如何递增、递减以及将自身与另一个迭代器进行比较。

所以以 vector 为例。 begin 迭代器如何知道在哪里停止递增? iter == nullptr 如何知道何时返回 true 以便停止?

或者取循环链表。它没有真正的结局。它仅在迭代器再次等于开始迭代器时停止。 nullptr 在那里结束意味着什么?

如果您考虑实现,就会明白为什么答案是“否”。

关于c++ - 使用 nullptr 而不是结束迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29938457/

相关文章:

c++ - header 包含和循环依赖

c++ - 如何在 C/C++ 中有效地计算 double 到两位小数?

c++ - 关于 C++ std::pair 的奇怪编译错误

c++ - VS2010 RC - 调试器中只有 100 个 std::map 元素

c++ - boost::serialization 如何与 C++11 中的 std::shared_ptr 一起使用?

c++ - VC++ 未声明的标识符

c++ - C++ 中的 STL : no match for 'operator*'

c++ - 将 ""键插入 map

c++ - 如何迭代两个类似 STL 的容器(笛卡尔积)

c++ - 从 STL 容器中 move 元素是否会将其从该容器中移除?