有人可以告诉我如何将迭代器增加2吗?
iter++
有空iter+2
吗-我必须做吗?我该如何实现?
Answers:
此方法适用于非随机访问迭代器的迭代器,但实现仍可对其进行专门化,使其效率不低于iter += 2
与随机访问迭代器一起使用时的效率。
http://www.cplusplus.com/reference/std/iterator/advance/
std::advance(it,n);
在这种情况下,n为2。
此函数的优点在于,如果“ it”是随机访问迭代器,则快速
it += n
使用操作(即vector <,,> :: iterator)。否则将其渲染为
for(int i = 0; i < n; i++)
++it;
(即list <..> :: iterator)
map<string,string>::iterator iter; for(iter = variations.begin(); iter != variations.end(); iter++) { map<string,string>::iterator it_tmp = std::next(iter, 1); // increment by 1 it_tmp = std::next(iter, 2); // increment by 2 }
将ITER将增加2?还是iter会影响it_tmp?
您可以使用“加法分配”运算符
iter += 2;
我们可以同时使用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
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);
}