我一直在使用高度简洁和直观的 C++ 语法来查找两个 sortedvector
的交集并将结果放在第三个中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()
返回 a forward iterator
,我认为它可能是也可能不是OutputIterator
。
无论如何,c.begin()
在clang下编译的代码。
在标准下保证会发生什么?如果这样编译,可能会发生什么 - 也就是说,当返回的迭代器c.begin()
最终递增超过向量的末尾,并尝试访问指向的元素时,必须/可能发生什么?在这种情况下,一个符合要求的实现可以默默地扩展向量,所以这begin()
实际上是一个附加的事情OutputIterator
吗back_inserter
?
我问这个主要是为了了解标准如何与迭代器一起工作:真正发生了什么,所以我可以在使用 STL 时超越复制和粘贴。