Cut*_*ute 63 c++ iterator stl visual-c++
谁能告诉我如何将迭代器增加2?
iter++可用 - 我必须这样做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)
您可以使用"按添加分配"运算符
iter += 2;
Run Code Online (Sandbox Code Playgroud)
我们可以同时使用std::advance和std::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)
如果您不知道容器中是否有足够的下一个元素,则需要在每次增量之间检查容器的末尾。++ 和 std::advance 都不会为你做这件事。
if( ++iter == collection.end())
... // stop
if( ++iter == collection.end())
... // stop
Run Code Online (Sandbox Code Playgroud)
您甚至可以推出自己的绑定安全高级功能。
如果你确定你不会走到最后,那么 std::advance( iter, 2 ) 是最好的解决方案。