如何增加一个迭代器2?

任何人都可以告诉我如何增加迭代器2?

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

std::advance( iter, 2 );

这种方法适用于不是随机访问迭代器的迭代器,但是当与随机访问迭代器一起使用时,它仍然可以被专用于实现,其效率不会低于it iter += 2

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

 std::advance(it,n); 

你的情况n是2。

这个函数的美妙之处在于,如果“它”是一个随机访问迭代器,那么这个函数就是快速的

 it += n 

操作被使用(即vector <,,> :: iterator)。 否则它的呈现

 for(int i = 0; i < n; i++) ++it; 

(即list <..> :: iterator)

您可以使用“添加赋值”操作符

 iter += 2; 

如果你没有一个迭代器可修改的左值,或者希望获得一个给定的迭代器的副本(保持原来的一个不变),那么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 

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

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

你甚至可以推出自己的绑定安全提前function。

如果你确定你不会过去,那么std :: advance(iter,2)是最好的解决scheme。

我们既可以同时使用也可以同时使用。 但是,这两者之间是有区别的。 “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 

“next”返回迭代器的修改副本

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

假设列表大小可能不是步骤的偶数倍,则必须防范溢出:

 static constexpr auto step = 2; // Guard against invalid initial iterator. if (!list.empty()) { for (auto it = list.begin(); /*nothing here*/; std::advance(it, step)) { // do stuff... // Guard against advance past end of iterator. if (std::distance(it, list.end()) > step) break; } } 

取决于收集实现,距离计算可能非常缓慢。 下面是最佳和更可读。 闭包可以通过const引用传递给列表最终值来更改为实用程序模板:

 const auto advance = [&](list_type::iterator& it, size_t step) { for (size_t i = 0; it != list.end() && i < step; std::next(it), ++i); }; static constexpr auto step = 2; for (auto it = list.begin(); it != list.end(); advance(it, step)) { // do stuff... } 

如果没有循环:

 static constexpr auto step = 2; auto it = list.begin(); if (step <= list.size()) { std::advance(it, step); } 

非常简单的答案:

 ++++iter 

漫长的回答:

你真的应该习惯于写++iter而不是iter++ 。 后者必须返回与旧价值不同的旧价值(副本); 这需要时间和空间。

请注意前缀增量( ++iter )取左值并返回一个左值,而后缀增量( iter++ )取左值并返回右值。