c++ - 如果我使用 vector::begin() 而不是 std::back_inserter(vector) 作为 set_intersection 的输出会怎样?

标签 c++ vector iterator containers set-intersection

我一直在使用高度简洁和直观的 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),假设 ab 已排序。

但是如果我只使用 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/

相关文章:

c++ - 变量类派生自某个抽象类的类模板

C++ - 指向对象的指针 vector 的性能与对象的性能

string - 如何在 rust 中返回字符串向量

matlab - 如何在matlab中制作三对角矩阵?

c++ - std::upper_bound 中的 boost::transform_iterator 编译错误

c++ - C 整数在 C++ 代码中使用时失去其常量状态

c++ - std::is_sorted 和比较器要求误导?

c++ - C++中的特殊枚举

c++ - 从指针或引用获取迭代器

java - java 统计字符串出现次数