有人能告诉我如何将迭代器增加2?
iter++
可用 - 我必须iter+2
吗?我怎样才能做到这一点?
答案 0 :(得分:89)
此方法适用于非随机访问迭代器的迭代器,但当与随机访问迭代器一起使用时,实现仍然可以使其专用于iter += 2
。
答案 1 :(得分:25)
http://www.cplusplus.com/reference/std/iterator/advance/
std::advance(it,n);
其中n为2。
这个函数的优点是,如果“it”是随机访问迭代器,那么快速
it += n
使用操作(即矢量<,> :: iterator)。否则将其渲染为
for(int i = 0; i < n; i++)
++it;
(即list&lt; ..&gt; :: iterator)
答案 2 :(得分:15)
如果你没有迭代器的可修改左值,或者希望获得给定迭代器的副本(保留原始迭代器不变),那么C ++ 11带有新的辅助函数 - {{3 } / std::next
:
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
答案 3 :(得分:7)
您可以使用'添加分配'操作符
iter += 2;
答案 4 :(得分:4)
如果您不知道容器中是否有足够的下一个元素,则需要在每个增量之间检查容器的末端。 ++和std :: advance都不会为你做这件事。
if( ++iter == collection.end())
... // stop
if( ++iter == collection.end())
... // stop
您甚至可以推出自己的绑定安全提前功能。
如果您确定不会结束,那么std :: advance(iter,2)是最好的解决方案。
答案 5 :(得分:1)
我们可以同时使用advance和next。但是,两者之间存在差异。 &#34;预先&#34;修改其参数并返回任何内容。因此,它可以用作:
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
&#34;下一个&#34;返回迭代器的修改副本
vector<int> v;
v.push_back(1);
v.push_back(2);
cout << *next(v.begin(), 1) << endl; //prints 2
答案 6 :(得分:0)
假设列表大小可能不是步骤的偶数倍,则必须防止溢出:
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);
}
答案 7 :(得分:-5)
非常简单的答案:
++++iter
答案很长:
你真的应该习惯写++iter
而不是iter++
。后者必须返回旧值的副本(与旧值不同);这需要时间和空间。
请注意,前缀增量(++iter
)采用左值并返回左值,而后缀增量(iter++
)采用左值并返回右值。