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

时间:2012-12-08 18:44:44

标签: c++ iterator

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

i = i + 3

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:4)

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

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

你仍然期望a等于5。

答案 2 :(得分:1)

这样你就可以写:

j = i + 3;

如果operator+没有创建新副本,它会做什么?修改i

答案 3 :(得分:1)

这是因为x + n应该更改x的值,而不管x是什么,无论是int还是{{ 1}}。这个想法是一样的。

但是如果你不想这样写:

iterator

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

it = it + 3;

请注意,如果某些标准容器不支持随机访问迭代器 1 ,则无法std::advance(it, 3); ,但你可以仍然写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 是唯一的方法(或者你自己编写这样的功能)

1。请注意std::advance(it,3)是随机访问迭代器,这就是您可以编写std::vector<T>::iterator的原因。功能