如果我使用vector::begin()而不是std::back\u插入器(vector)作为set\u交集的输出,会发生什么? 我一直使用高度简洁直观的C++语法来找到两个排序的向量< /C> > s的交集,并将结果放在第三代码>向量 >: vector<bar> a,b,c; //... std::set_intersection(a.begin(),a.end(),b.begin(),b.end(), std::back_inserter(c));

如果我使用vector::begin()而不是std::back\u插入器(vector)作为set\u交集的输出,会发生什么? 我一直使用高度简洁直观的C++语法来找到两个排序的向量< /C> > s的交集,并将结果放在第三代码>向量 >: vector<bar> a,b,c; //... std::set_intersection(a.begin(),a.end(),b.begin(),b.end(), std::back_inserter(c));,c++,vector,iterator,containers,set-intersection,C++,Vector,Iterator,Containers,Set Intersection,set\u intersection期望在该参数处有一个outputierator。我认为标准只要求c.begin()返回一个正向迭代器,我想它可能是也可能不是一个输出迭代器 无论如何,带有c.begin()的代码是在clang下编译的 在标准下保证会发生什么?如果进行编译,可能会发生什么?也就是说,当c.begin()返回的迭代器最终递增超过向量的末尾,并且尝试访问指向的元素时,必须/可能会发生什么?在这种情况下,一致性实现能否静默地扩展向量,从而使begin()实际上是一个追加outputi

set\u intersection
期望在该参数处有一个
outputierator
。我认为标准只要求
c.begin()
返回一个
正向迭代器
,我想它可能是也可能不是一个
输出迭代器

无论如何,带有
c.begin()
的代码是在clang下编译的

在标准下保证会发生什么?如果进行编译,可能会发生什么?也就是说,当
c.begin()
返回的迭代器最终递增超过向量的末尾,并且尝试访问指向的元素时,必须/可能会发生什么?在这种情况下,一致性实现能否静默地扩展向量,从而使
begin()
实际上是一个追加
outputierator
,就像
back\u inserter
一样


我问这个问题主要是为了了解标准是如何与迭代器一起工作的:到底发生了什么,这样我就可以超越使用STL复制和粘贴的范围。

back\u inserter
通过调用
push\u back
(这就是为什么不能将
back\u inserter
与不提供
push\u back
操作的范围一起使用的原因)

因此,当
push\u back
自动扩展容器时,您不必担心超出范围的末尾。但是,使用
begin()
插入时,情况并非如此


如果您使用的是
begin()
,然后您必须确保目标范围足够大,可以容纳所有元素。如果不这样做,将立即将代码传输到未定义行为的领域。

它编译得很好,因为您从
begin
函数获得了一个有效的迭代器,但是如果向量为空,则您将返回
end
迭代器,然后从那里继续

只有当目标向量已经包含至少与您尝试添加的元素数量相同的元素时,它才会起作用,然后它将实际覆盖这些元素而不添加新元素


添加元素正是迭代器所做的,它返回一个迭代器,它基本上在向量上向后推。

输出迭代器的重要要求是它在范围
[out,out+
输出大小

传递
c.begin()


back\u inserter
将每个赋值添加到
向量中(通过
push\u back
),并提供一种使STL算法扩展范围的简洁方法-它适当地重载迭代器使用的运算符。

因此

一旦
set\u intersection
将某些内容写入其输出迭代器,即当
a
b
的集合交集不为空时,调用未定义的行为

在这种情况下,一致性实现能否静默地扩展向量,从而使begin()实际上是一个追加的
输出迭代器
,就像
反向插入器
一样


当然,这是未定义的行为。(这是一个幽默的方式告诉你,你不应该考虑使用这个,不管对任何实现的影响。)< /P>是代码>矢量< /代码>与<代码> STD::向量< /代码>?@沃尔特是的,固定的,谢谢。
 std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                       c.begin());
 std::set_intersection(a.begin(),a.end(),b.begin(),b.end(),
                       c.begin());