1. ホーム
  2. c++

[解決済み] C++11で範囲ベースのforループで使用するための範囲クラスはありますか?

2022-11-28 01:06:45

質問

ついさっき、これを書いている自分に気がつきました。

template <long int T_begin, long int T_end>
class range_class {
 public:
   class iterator {
      friend class range_class;
    public:
      long int operator *() const { return i_; }
      const iterator &operator ++() { ++i_; return *this; }
      iterator operator ++(int) { iterator copy(*this); ++i_; return copy; }

      bool operator ==(const iterator &other) const { return i_ == other.i_; }
      bool operator !=(const iterator &other) const { return i_ != other.i_; }

    protected:
      iterator(long int start) : i_ (start) { }

    private:
      unsigned long i_;
   };

   iterator begin() const { return iterator(T_begin); }
   iterator end() const { return iterator(T_end); }
};

template <long int T_begin, long int T_end>
const range_class<T_begin, T_end>
range()
{
   return range_class<T_begin, T_end>();
}

で、これによってこんな風に書けるようになりました。

for (auto i: range<0, 10>()) {
    // stuff with i
}

さて、私が書いたものはもしかしたら最良のコードではないかもしれないことは分かっています。そして、もっと柔軟で便利な方法があるかもしれません。しかし、このようなものが標準の一部となるべきだったように思います。

それで、それは何ですか?整数の範囲、あるいは計算されたスカラー値の一般的な範囲に対するイテレータのために、ある種の新しいライブラリが追加されたのでしょうか?

どのように解決するのですか?

C++の標準ライブラリにはありませんが Boost.Rangeにはboost::counting_rangeがあります。 があり、これは確かに適格です。また ブースト::イランジ を使用することもできます。これはもう少し範囲を絞ったものです。

C++20の範囲ライブラリでは、これを view::iota(start, end) .