基于范围的c ++ 11

Far*_*zam 10 c++ gcc for-loop c++11

在c ++ 11中,如果我们有set<int> S; 我们可以说:

for (auto i: S)
    cout << i << endl;
Run Code Online (Sandbox Code Playgroud)

但我们可以强制i成为迭代器,我的意思是编写一个相当于以下代码的代码:

for (auto i = S.begin(); i != S.end(); i++)
    cout << (i != s.begin()) ? " " : "" << *i;
Run Code Online (Sandbox Code Playgroud)

或者我们可以做一些我们可以理解i集合(或向量)中的索引的东西吗?

另一个问题是我们怎么能说不要对所有元素都这样做,S但对于前半部分或除了第一部分之外的所有元素.

或者当我们有一个vector<int> V,并且想要打印它的第一个n值时我们该怎么做?我知道我们可以创建一个新的向量,但是将一个向量复制到一个新向量需要时间.

Dam*_*mon 20

不,不幸的是.看看标准说的是什么:

(for-range-declaration:expression)语句的基于范围的for语句等效于

{
    auto && __range = ( expression );
    for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
        for-range-declaration = *__begin;
        statement
    }
}
Run Code Online (Sandbox Code Playgroud)

其中__range,__ begin和__end是仅为展示定义的变量

换句话说,它已经迭代beginend并且已经解引用迭代器,这是你永远不会看到的.

  • 使用过滤前向迭代器(迭代集合,但只访问满足谓词的值),迭代器更容易检查它是否已完成(无论如何必须这样做),而不是将其与最终迭代器.通过定义end()以返回一些不同的虚拟类型,可以实现operator!=,使其仅检查迭代器是否完成.(我最近实现了这样的迭代器.) (2认同)

Mat*_* M. 9

基于范围的原则for是迭代整个范围.

但是,您可以决定范围是什么,因此您可以对范围本身进行操作.

template <typename It>
class RangeView {
public:
  typedef It iterator;

  RangeView(): _begin(), _end() {}
  RangeView(iterator begin, iterator end): _begin(begin), _end(end) {}

  iterator begin() const { return _begin; }
  iterator end() const { return _end; }

private:
  iterator _begin;
  iterator _end;
};

template <typename C>
RangeView<typename C::iterator> rangeView(C& c, size_t begin, size_t end) {
  return RangeView<typename C::iterator>(
           std::next(c.begin(), begin),
           std::next(c.begin(), end)
         );
}

template <typename C>
RangeView<typename C::const_iterator> rangeView(C const& c, size_t begin, size_t end) {
  return RangeView<typename C::const_iterator>(
           std::next(c.begin(), begin),
           std::next(c.begin(), end)
         );
}
Run Code Online (Sandbox Code Playgroud)

好吧,这严重重新组合了Boost.Range ......

而现在,让我们使用它!

for (auto i: rangeView(set, 1, 10)) {
  // iterate through the second to the ninth element
}
Run Code Online (Sandbox Code Playgroud)

  • 要欣赏美景.+1 (2认同)