c – 容器迭代器是否定义了常规覆盖复制模式?
以下代码编译得很好,用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对象)应该具有迭代器的返回类型,其定义为:
前向迭代器要求不包括输出迭代器的要求,因此上面的示例是未定义的吗?我使用迭代器作为输出迭代器,即使没有明显的保证它将是一个. 我相当肯定上面的代码是有效的,所以我的猜测是你可以从容器的细节推断出begin()返回的前向迭代器实际上也会支持输出迭代器的要求.在那种情况下,begin()何时不返回输出迭代器?只有当容器是const或者还有其他情况时? 解决方法
正向迭代器可以符合输出迭代器的规范(如果它们是可变的),具体取决于序列的类型.它没有明确说明(不像它们输入迭代器要求的事实),但如果我们看一下需求表
我们可以去检查给定的前向迭代器是否符合它们:
可变引用是可分配的(除非你有一个不可分配的类型,显然).
表109中的第一行与输出迭代器的要求相同,只是前向迭代器没有备注.第二行比输出迭代器更具限制性,因为它指定必须返回引用. 最重要的是,如果你有一个可变的前向迭代器到一系列可复制的类型,你就有了一个有效的输出迭代器. (从技术上讲,具有operator =(…)const和可变成员的类型序列中的常量迭代器也符合条件,但是我们希望没有人做类似的事情.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |