使用nullptr而不是end iterator

Ban*_*tak 0 c++ stl

我想知道是否可以使用nullptr或某种通用的end迭代器.

例如:

// 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());
Run Code Online (Sandbox Code Playgroud)

您通常会编写以指定初始化新地图的开始和结束.

如果我只想复制整个地图,为什么还需要指定结束标记.

我更喜欢这样的东西:

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

要么

std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin());
Run Code Online (Sandbox Code Playgroud)

要么

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

编辑:我将示例从std :: list <int>更改为std :: unordered_map <int,int>.从std :: map到std :: unordered_map没有复制构造函数.

Zan*_*ynx 5

要回答问题,"是否可以使用nullptr而不是end()?"

没有.

请考虑如何实现容器和迭代器.容器知道它的开始和结束迭代器.迭代器知道如何递增,递减并将自身与另一个迭代器进行比较.

所以以矢量为例.begin迭代器如何知道停止递增的位置?怎么会iter == nullptr知道何时返回真实所以它可以停止?

或者采用循环链表.它没有真正的结局.它只在迭代器再次等于begin迭代器时停止.nullptr甚至意味着什么结束?

如果你考虑实施,你会明白为什么答案是"不".