如何将迭代器增加2?

Cut*_*ute 63 c++ iterator stl visual-c++

谁能告诉我如何将迭代器增加2?

iter++可用 - 我必须这样做iter+2吗?我怎样才能做到这一点?

CB *_*ley 95

std::advance( iter, 2 );

此方法适用于非随机访问迭代器的迭代器,但实现时仍然可以将其专用于iter += 2与随机访问迭代器一起使用时的效率.


Mai*_*ann 27

http://www.cplusplus.com/reference/std/iterator/advance/

std::advance(it,n);
Run Code Online (Sandbox Code Playgroud)

在你的情况下,n为2.

这个函数的优点是,如果"它"是一个随机访问迭代器,那就快了

it += n
Run Code Online (Sandbox Code Playgroud)

使用了操作(即vector <,,> :: iterator).否则它呈现给

for(int i = 0; i < n; i++)
    ++it;
Run Code Online (Sandbox Code Playgroud)

(即list <..> :: iterator)


Pio*_*cki 18

如果你没有迭代器的可修改左值,或者希望获得给定迭代器的副本(保留原始迭代器不变),那么C++ 11带有新的辅助函数 - std::next/ std::prev:

std::next(iter, 2);          // returns a copy of iter incremented by 2
std::next(std::begin(v), 2); // returns a copy of begin(v) incremented by 2
std::prev(iter, 2);          // returns a copy of iter decremented by 2
Run Code Online (Sandbox Code Playgroud)


tea*_*bot 8

您可以使用"按添加分配"运算符

iter += 2;
Run Code Online (Sandbox Code Playgroud)

  • @Xetius:你不应该这样做.这是未定义的行为. (4认同)
  • 这不适用于所有迭代器类型.只需要RandomAccessIterators来支持添加. (3认同)
  • 如果迭代器当前指向最后一个元素会发生什么?增量后它会指向哪里? (2认同)
  • ++ iter ++绑定为++(iter ++),iter ++不是可修改的左值,所以你不能'做'++(iter ++).如果它被允许,它可能不会做它可能的预期. (2认同)

skp*_*o19 7

我们可以同时使用std::advancestd::next,但两者之间存在差异。

advance修改其参数并且不返回任何内容。所以它可以用作:

vector<int> v;
v.push_back(1);
v.push_back(2);
auto itr = v.begin();
advance(itr, 1);          //modifies the itr
cout << *itr<<endl        //prints 2
Run Code Online (Sandbox Code Playgroud)

next 返回迭代器的修改副本:

vector<int> v;
v.push_back(1);
v.push_back(2);
cout << *next(v.begin(), 1) << endl;    //prints 2
Run Code Online (Sandbox Code Playgroud)


Jem*_*Jem 5

如果您不知道容器中是否有足够的下一个元素,则需要在每次增量之间检查容器的末尾。++ 和 std::advance 都不会为你做这件事。

if( ++iter == collection.end())
  ... // stop

if( ++iter == collection.end())
  ... // stop
Run Code Online (Sandbox Code Playgroud)

您甚至可以推出自己的绑定安全高级功能。

如果你确定你不会走到最后,那么 std::advance( iter, 2 ) 是最好的解决方案。