使用非随机访问迭代器的非单元迭代器跨度
使用随机访问迭代器,可以通过简单地执行iter + = 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和< iter.end()似乎是未定义类似的std ::集。想要遍历一个只访问每个其他元素(子采样)的集合似乎是合理的,不是吗?有没有另一种方法来做到这一点?
与随机访问迭代器,你可以简单地做
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;
}
如果你把这个调用作为两个函数之一,一个是随机访问,另一个是服用其他迭代器,对于向量等来说更好。 – 2012-02-22 01:15:27
@詹姆斯麦克奈利斯: 很酷,谢谢。我像这样使用它:IteratorType iter = v.begin(); while(try_advance(iter,v.end(),2)){std :: cout bool try_advance(TForwardIt&it,TForwardIt const end,const unsigned int n){unsigned int i = 0; while(i
我在iPad上,所以我不能对此进行测试,但尝试以下
std::advance(iter, 2);
+1。它确实提升了它的两个位置......但是,超过@James指出的容器底部的问题依然存在。 – 2012-02-22 00:55:39
啊是的,这绝对是第1部分的解决方案:) – 2012-02-22 00:59:57
可以与边界/指针检查结合使用,几乎没有优雅的寿命... :) – 2012-02-22 01:05:44
我在iPad上,所以我无法用代码进行实验,但我只是想知道是否使用非const迭代器来试用这个代码? – 2012-02-22 00:46:04