Jos*_*eld 3 c++ containers iterator c++11
下面的代码编译就好了,覆盖的值v2
与来自v1
:
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());
Run Code Online (Sandbox Code Playgroud)
第三个参数std::copy
是OutputIterator.然而,容器的要求指定a.begin()
,其中a
是容器对象,应该有一个返回类型iterator
,其定义为:
任何满足前向迭代器要求的迭代器类别.
前向迭代器要求不包括输出迭代器的要求,因此上面的示例是未定义的吗?我使用迭代器作为输出迭代器,即使没有明显的保证它将是一个.
我相当肯定上面的代码是有效的,所以我的猜测是你可以从有关容器的细节推断出前进迭代器返回的begin()
实际上也会支持输出迭代器的要求.在那种情况下,什么时候begin()
不返回输出迭代器?只有当容器const
处于或有其他情况时?
正向迭代器可以符合输出迭代器的规范(如果它们是可变的),具体取决于序列的类型.它没有明确说明(不像它们输入迭代器要求的事实),但如果我们看一下需求表
我们可以去检查给定的前向迭代器是否符合它们:
*r = o
(§24.2.5/1)
:ifX
是一个可变的迭代器,reference
是一个引用T
可变引用是可分配的(除非你有一个不可分配的类型,显然).
++r
,r++
,*r++ = o
(§24.2.5 Table 109)
表109中的第一行与输出迭代器的要求相同,只是前向迭代器没有备注.第二行比输出迭代器更具限制性,因为它指定reference
必须返回a.
最重要的是,如果你有一个可变的前向迭代器到一系列可复制的类型,你就有了一个有效的输出迭代器.
(从技术上讲,具有operator=(...) const
可变成员的类型序列中的常量迭代器也符合条件,但我们希望没有人能做到这样的事情.)