加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 容器迭代器是否定义了常规覆盖复制模式?

发布时间:2020-12-16 10:23:01 所属栏目:百科 来源:网络整理
导读:以下代码编译得很好,用v1中的值覆盖v2中的值: std::vectorint v1 = {1,2,3,4,5};std::vectorint v2 = {6,7,8,9,10};std::copy(v1.begin(),v1.end(),v2.begin()); std :: copy的第三个参数是一个OutputIterator.但是,Container要求指定a.begin()(其中a是Cont
以下代码编译得很好,用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对象)应该具有迭代器的返回类型,其定义为:

any iterator category that meets the forward iterator requirements.

前向迭代器要求不包括输出迭代器的要求,因此上面的示例是未定义的吗?我使用迭代器作为输出迭代器,即使没有明显的保证它将是一个.

我相当肯定上面的代码是有效的,所以我的猜测是你可以从容器的细节推断出begin()返回的前向迭代器实际上也会支持输出迭代器的要求.在那种情况下,begin()何时不返回输出迭代器?只有当容器是const或者还有其他情况时?

解决方法

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

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

*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中的第一行与输出迭代器的要求相同,只是前向迭代器没有备注.第二行比输出迭代器更具限制性,因为它指定必须返回引用.

最重要的是,如果你有一个可变的前向迭代器到一系列可复制的类型,你就有了一个有效的输出迭代器.

(从技术上讲,具有operator =(…)const和可变成员的类型序列中的常量迭代器也符合条件,但是我们希望没有人做类似的事情.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读