2012-02-22 83 views
3

使用随机访问迭代器,可以通过简单地执行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 ::集。想要遍历一个只访问每个其他元素(子采样)的集合似乎是合理的,不是吗?有没有另一种方法来做到这一点?

+0

我在iPad上,所以我无法用代码进行实验,但我只是想知道是否使用非const迭代器来试用这个代码? – 2012-02-22 00:46:04

回答

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; 
} 
+0

如果你把这个调用作为两个函数之一,一个是随机访问,另一个是服用其他迭代器,对于向量等来说更好。 – 2012-02-22 01:15:27

+0

@詹姆斯麦克奈利斯: 很酷,谢谢。我像这样使用它:IteratorType iter = v.begin(); while(try_advance(iter,v.end(),2)){std :: cout <<“”<< * iter; } TD差异的想法是什么?为什么不只是:template bool try_advance(TForwardIt&it,TForwardIt const end,const unsigned int n){unsigned int i = 0; while(i 2012-02-22 12:42:42

2

我在iPad上,所以我不能对此进行测试,但尝试以下

std::advance(iter, 2); 
+1

+1。它确实提升了它的两个位置......但是,超过@James指出的容器底部的问题依然存在。 – 2012-02-22 00:55:39

+0

啊是的,这绝对是第1部分的解决方案:) – 2012-02-22 00:59:57

+0

可以与边界/指针检查结合使用,几乎没有优雅的寿命... :) – 2012-02-22 01:05:44