3

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

i = i + 3

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

4

4 回答 4

5

模仿人们期望的自然行为+。同样的方式:

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

第二行没有改变x,它只是计算为 3 的值。但是,x++ 修改x.

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

于 2012-12-08T18:46:32.830 回答
4

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

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

您仍然希望 a 等于 5。

于 2012-12-08T18:47:04.013 回答
1

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

但是,如果您不想这样写:

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)是唯一的方法(否则你必须自己编写这样的功能)

1.注意这std::vector<T>::iterator是随机访问迭代器,这就是你可以写的原因it+3

于 2012-12-08T18:59:44.760 回答
1

这样你就可以写:

j = i + 3;

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

于 2012-12-08T18:46:57.990 回答