C++ 使用nullptr而不是end迭代器

C++ 使用nullptr而不是end迭代器,c++,stl,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()); //a.b->cdef().g->bdf()是一个std::map std::无序映射副本

我想知道是否可以使用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());
//a.b->cdef().g->bdf()是一个std::map
std::无序映射副本(a.b->cdef().g->bdf().begin(),a.b->cdef().g->bdf().end());
是通常用来指定开始和结束以初始化新映射的内容

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

我更喜欢这样的:

std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin(), nullptr);
std::无序映射副本(a.b->cdef().g->bdf().begin(),nullptr);

std::无序映射副本(a.b->cdef().g->bdf().begin());

std::无序映射副本(a.b->cdef().g->bdf().begin(),std::无序映射::end);

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

如果要将整个容器的内容复制到不同类型的容器中,可以使用帮助器函数

template<typename InputIterRange, typename OutputIter>
OutputIter range_copy(InputIterRange&& range, OutputIter out_iter)
{
  return std::copy(range.begin(), range.end(), out_iter);
}

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

没有

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

以向量为例。begin迭代器如何知道在哪里停止递增?
iter==nullptr
如何知道何时返回true才能停止

或者以循环链表为例。它没有真正的终点。它仅在迭代器再次等于begin迭代器时停止。nullptr作为最终目标意味着什么


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

STL中范围的复制主要是使用一对迭代器指定的。这是因为大多数复制操作需要是有限的,并且很难使用单个迭代器指定有限的范围

nullptr
不是任何标准容器都将返回的迭代器,并且不提供替代方法

替代方法包括添加一个helper函数,该函数接受容器作为参数(最好通过引用)。然后,就可以从这些容器中提取迭代器,而不那么麻烦


最好的选择几乎肯定是改进您的基本设计和编码技术,以避免代码需要显式地挖掘过多的嵌套结构来查找数据(例如
a.b->cdef().g->bdf()
)。简单易读的代码更容易理解,因此更容易理解。

您编写的三条语句是否有效?你的编译器怎么说?
std::list copy(a.b->cdef().g->bdf())不,它们不工作。我想知道STL中是否有类似的功能,因此我不必指定end()迭代器。构造函数#4将2个迭代器作为输入并复制元素。这就是我想做的。我添加了a.b->cdef().g->bdf()作为我不想重复的长参数的一个示例。好的,也许列表是一个不好的示例。我最初的目标是将std::map的元素复制到std::unordered_map,这不能简单地通过复制构造函数或赋值运算符来完成。我认为以std::list为例会更容易。对于std::copy,您还需要两个迭代器。@Bantak添加了一个例子。我的问题的全部目的是减小大小,不必通过两个迭代器,而是通过1个。@Bantak这里只传递了一个迭代器。我接受了这个答案,因为它回答了我的问题是否可能。答案是否定的。它还包括一个原因。向量就是帮助我得到它的原因。
std::unordered_map<int, int> copy(a.b->cdef().g->bdf().begin(), std::unordered_map::end);
template<typename InputIterRange, typename OutputIter>
OutputIter range_copy(InputIterRange&& range, OutputIter out_iter)
{
  return std::copy(range.begin(), range.end(), out_iter);
}
int main() {
    std::set<int> a{1,2,3,4,5};
    std::unordered_set<int> b {11,22,33};
    range_copy(a, std::inserter(b, b.end()));
}