使用随机访问迭代器,您可以通过简单地执行操作+ = n然后使用<来改变步幅长度。 container.end()而不是!= container.end()作为循环结束条件:
#include <iostream>
#include <vector>
int main(int argc, char *argv[])
{
typedef std::vector<float> VectorType;
typedef VectorType::const_iterator IteratorType;
VectorType v;
for(unsigned int i = 0; i < 11; ++i)
{
v.push_back(i);
}
for(IteratorType iter = v.begin(); iter < v.end(); iter += 2)
{
std::cout << " " << *iter;
}
return 0;
}
然而,+ = 2和&lt; iter.end()似乎是未定义的类似std :: set的东西。想要遍历一个只访问每个其他元素的集合(对它进行二次抽样)似乎是合理的,不是吗?还有另一种方法吗?
答案 0 :(得分:4)
使用随机访问迭代器,您只需执行
iter+=n
,然后使用< container.end()
代替!= container.end()
作为循环结束条件,即可更改步幅
实际上,你做不到。虽然代码可以编译,但如果迭代器实际超过容器的末尾,则它在运行时会显示未定义的行为。你不能将迭代器增加到超出它指向的范围的末尾。
在任何情况下,您都可以编写一个功能模板来帮助:
template <typename TForwardIt, typename TDifference>
bool try_advance(TForwardIt& it,
TForwardIt const end,
TDifference n)
{
TDifference i(0);
while (i < n && it != end)
{
++i;
++it;
}
return i == n;
}
答案 1 :(得分:2)
我在iPad上,所以我无法测试,但请尝试以下
std::advance(iter, 2);