如果我使用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());