C++ 为什么迭代器运算符+;还一份吗?

C++ 为什么迭代器运算符+;还一份吗?,c++,iterator,C++,Iterator,如果您有一个迭代器vector::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++三次)。这样您就可以编写

如果您有一个迭代器
vector::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++
三次)。

这样您就可以编写:

j = i + 3;

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

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

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

您仍然希望a等于5。

这是因为
x+n
不应更改
x
的值,而不管
x
是什么,无论它是
int
还是
迭代器。想法是一样的

但是,如果您不想写以下内容:

it = it + 3;
std::advance(it, 3);
然后你有一个选择,你可以写下:

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::list::iterator it=lst.begin();
it=it+3//编译错误`它不是随机访问迭代器
标准:先进(it,3)//可以
因此,在这种情况下,
std::advance(it,3)
是唯一的方法(否则您必须自己编写这样的功能)


一,。请注意,
std::vector::iterator
是随机访问迭代器,这就是为什么您可以编写
it+3

你期待什么样的选择<代码>i+3变异
i
以前进3?为什么二进制
运算符+
返回副本?因为在语义上,
A+B
应该返回一个新的对象,并且不修改参数。为了进一步说明这个逻辑,如果您说
2+3
,会发生什么?您不会更改
2
3
,而是接受这两个参数并创建一个结果
5
,同时保持
2
3
不变(因为改变
2
3
毫无意义……如果你以某种方式改变
2
3
,你会毁掉整个数学世界。)。类似地,如果用迭代器或其他变量替换
2
,则保持逻辑不变,不更改迭代器或变量,而是返回表示结果的新实例是有意义的。