为什么迭代器运算符 + 返回副本
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
是什么,无论是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
。
相关文章:
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- C 标准:通过复制返回以初始化无RVO的参考:是否有任何副本
- 如何在模板类中返回成员变量的副本
- 如何声明接受转发引用并返回引用或副本的函数模板
- 有条件的操作员从其参数的副本中返回值
- 我可以返回副本作为参考吗?
- 返回不带副本 ctor 的引用
- 'std::any_cast' 返回一个副本
- 按值副本返回,而不是移动
- 参考参数返回副本
- C++方法返回自身副本时内存泄漏
- 为什么迭代器运算符 + 返回副本
- 节点.js C++ 插件:返回新副本
- 如何通过制作副本从函数返回引用
- 为什么返回 std::vector 仍然是在制作副本
- 就地修改并返回副本有意义吗
- 为什么在 constexpr 函数中允许返回对常量指针的引用,但不返回副本
- 按方法返回副本或引用
- 在c++中通过成员函数返回引用比返回副本快
- 由于继承,堆栈返回副本