繁体   English   中英

为什么迭代器操作符+返回副本?

[英]Why does an iterator operator + return a copy?

如果你有一个迭代器vector<int>::iterator i = vector.begin()i++会将实际的迭代器向下移动。 但为什么会这样呢

i = i + 3

给你一个新的迭代器三个门?

模仿人们期望的自然行为+ 与以下相同的方式:

int x = 0;
int y = x + 3;

第二行不会更改x ,它只是计算值3.但是, x++ 修改x

如果你想推进通用迭代器,你应该使用std::advance(i, 3) (它将在随机访问迭代器上做i += 3而在任何其他迭代迭代器上做i++三次)。

当您使用operator+ ,您不希望修改任何一个操作数。 这意味着必须创建一个新对象。 就像你这样做:

int a = 5;
int b = a + 3;

你仍然希望a等于5。

这样你就可以写:

j = i + 3;

如果operator+没有创建一个新的副本,那是什么? 修改i

这是因为x + n 应该改变的值x ,不论什么x是,无论是intiterator 这个想法是一样的。

但是如果你不想写这个:

it = it + 3;

然后你有另一种选择,你可以这样写:

std::advance(it, 3);

请注意,如果某些标准容器不支持随机访问迭代器 1则不能it = it + 3 ,但您仍然可以编写std::advance(it,3) 例如:

std::list<int>::iterator it = lst.begin();

it  = it + 3; //COMPILATION ERROR. `it` is not random access iterator

std::advance(it,3); //okay

所以在这种情况下, std::advance(it,3)是唯一的方法(或者你自己编写这样的功能)

注意std::vector<T>::iterator是随机访问迭代器,这就是为什么你可以写it+3

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM