如何增加一个迭代器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++
)取左值并返回右值。