我一直在使用高度简洁和直观的 C++ 语法来查找两个排序的 vector
的交集并将结果放入第三个 vector
:
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
这应该将 c
设置为 intersection(a
,b
),假设 a
和 b
已排序。
但是如果我只使用 c.begin()
会怎么样(我想我在某个地方看到了一个例子,这就是我这样做的原因):
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
c.begin());
set_intersection
期望在该参数处有一个 OutputIterator
。我认为标准只需要 c.begin()
返回一个 forward iterator
,我认为它可能是也可能不是 OutputIterator
。
不管怎样,在clang下编译的带有c.begin()
的代码。
根据标准保证会发生什么?如果编译通过,可能会发生什么 - 也就是说,当 c.begin()
返回的迭代器最终递增到超过 vector 末尾时,并尝试访问指向的元素到,什么必须/可能发生?在这种情况下,符合规范的实现是否可以默默地扩展 vector ,以便 begin()
实际上是一个附加的 OutputIterator
,就像 back_inserter
一样?
我问这个主要是为了了解标准如何与迭代器一起工作:到底发生了什么,这样我就可以在使用 STL 时超越复制和粘贴。
最佳答案
back_inserter
通过调用 push_back
将元素插入到范围内(这就是为什么你不能将 back_inserter
与不包含的范围一起使用的原因提供 push_back
操作)。
因此,您不会关心超出范围的末尾,因为 push_back
会自动扩展容器。但是,使用 begin()
插入时情况并非如此。
如果您正在使用 begin()
,那么您必须确保目标范围足够大以容纳所有元素。不这样做会立即将您的代码传输到未定义行为的领域。
关于c++ - 如果我使用 vector::begin() 而不是 std::back_inserter(vector) 作为 set_intersection 的输出会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215748/