Is there a range class in C++11 for use with range based for loops?

前端 未结 8 1286
失恋的感觉
失恋的感觉 2020-11-27 11:33

I found myself writing this just a bit ago:

template 
class range_class {
 public:
   class iterator {
      friend c         


        
8条回答
  •  难免孤独
    2020-11-27 11:47

    As far as I know, there is no such class in C++11.

    Anyway, I tried to improve your implementation. I made it non-template, as I don't see any advantage in making it template. On the contrary, it has one major disadvantage : that you cannot create the range at runtime, as you need to know the template arguments at compile time itself.

    //your version
    auto x = range(); //m and n must be known at compile time
    
    //my version
    auto x = range(m,n);  //m and n may be known at runtime as well!
    

    Here is the code:

    class range {
     public:
       class iterator {
          friend class range;
        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 begin_; }
       iterator end() const { return end_; }
       range(long int  begin, long int end) : begin_(begin), end_(end) {}
    private:
       iterator begin_;
       iterator end_;
    };
    

    Test code:

    int main() {
          int m, n;
          std::istringstream in("10 20");
          if ( in >> m >> n ) //using in, because std::cin cannot be used at coliru.
          {
            if ( m > n ) std::swap(m,n); 
            for (auto i : range(m,n)) 
            {
                 std::cout << i << " ";
            }
          }
          else 
            std::cout <<"invalid input";
    }
    

    Output:

    10 11 12 13 14 15 16 17 18 19

    Onine demo.

提交回复
热议问题