为什么迭代器运算符 + 返回副本

Why does an iterator operator + return a copy?

本文关键字:返回 副本 运算符 迭代器 为什么      更新时间:2023-10-16

如果你有一个迭代器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是什么,无论是int还是iterator。这个想法是一样的。

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

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