我一直在使用简洁而直观的C++语法来查找两个已排序的vector
的交集,并将结果放入第三个vector
中:
vector<bar> a,b,c;
//...
std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
std::back_inserter(c));
假设a
和b
已经排序,这将设置c
为交集(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
,也可能不是。
即使带有c.begin()
的代码可以在clang编译通过,但这个标准究竟保证了什么呢?如果代码能够成功编译,那么当迭代器c.begin()
最终增加到超过向量长度后,尝试访问指针指向的元素时,必须/可能发生什么事情呢?符合规范的实现是否可以默默地扩展向量,使得begin()
实际上是一种追加型OutputIterator
,类似于back_inserter
?
我的问题主要是想了解标准与迭代器之间的关系,以便在使用STL时不再局限于简单的复制和粘贴。