非单元迭代器使用非随机访问迭代器

时间:2012-02-22 00:39:41

标签: c++

使用随机访问迭代器,您可以通过简单地执行操作+ = 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的东西。想要遍历一个只访问每个其他元素的集合(对它进行二次抽样)似乎是合理的,不是吗?还有另一种方法吗?

2 个答案:

答案 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);