c++ - 容器迭代器是否未定义常规覆盖复制模式?

标签 c++ c++11 iterator containers

下面的代码编译得很好,用 v1 中的值覆盖了 v2 中的值:

std::vector<int> v1 = {1, 2, 3, 4, 5};
std::vector<int> v2 = {6, 7, 8, 9, 10};

std::copy(v1.begin(), v1.end(), v2.begin());

std::copy 的第三个参数是一个 OutputIterator。但是,Container 要求指定 a.begin()(其中 a 是一个 Container 对象)应该具有 iterator 的返回类型,即定义为:

any iterator category that meets the forward iterator requirements.

前向迭代器要求不包括输出迭代器要求,所以上面的例子是未定义的吗?我将迭代器用作输出迭代器,尽管没有明显的保证它将是一个。

不过,我相当确定上面的代码是有效的,所以我的猜测是您可以从有关容器的详细信息中推断出 begin() 返回的正向迭代器实际上也支持输出迭代器要求。在这种情况下,begin() 何时返回输出迭代器?仅当容器为const时还是有其他情况?

最佳答案

如果前向迭代器是可变的,则前向迭代器可以符合输出迭代器的规范,具体取决于序列的类型。它没有明确说明(不像他们输入迭代器要求的事实),但如果我们看一下要求表

Output iterator requirements

我们可以去检查给定的前向迭代器是否符合它们:

*r = o
(§24.2.5/1): if X is a mutable iterator, reference is a reference to T

可变引用是可分配的(除非你有一个不可分配的类型,显然)。

++r, r++, *r++ = o
(§24.2.5 Table 109) Forward iterator requirements

表 109 中的第一行与输出迭代器的要求相同,只是前向迭代器没有注释。第二行比输出迭代器更严格,因为它指定必须返回一个reference

底线,如果您有一个可变的前向迭代器到一系列可复制分配的类型中,您就有一个有效的输出迭代器

(从技术上讲,一个包含 operator=(...) const 和可变成员的类型序列的常量迭代器也符合条件,但我们希望没有人这样做。)

关于c++ - 容器迭代器是否未定义常规覆盖复制模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608360/

相关文章:

c++ - 有没有一种可靠的方法可以强制线程在 C++ 中停止? (尤其是独立的)

java - java中遍历Avl树

JAVA:嵌套在公共(public)类的迭代器中

c++ - Ctest/CDash 工作流程 : deploying nightly builds

c++ - 在 C++ 中的 unique_ptr 之间进行转换

c++ - 为什么GCC执行1/0会报Floating Point Exception?

c++ - 使用 SFINAE 检测模板方法

c++ - 迭代器如何找到链表中的下一个地址

c# - 链表的应用 C++ vs C#

c++ - operator = 模板类中的重载