PYTHON的Range类非常好用,所以用C++来简单实现下:
1 // 实现Range类,用于遍历 2 // 3 4 #include <string> 5 6 class Range { 7 public: 8 9 // for(auto i:Range(1,10); 10 // 这个拆开就是这样: 11 // Range::RangeIterator it 12 // while( it != it.end() ) { 13 // i = *it 14 // it++ 15 // } 16 // 17 // so,迭代器只需要支持操作符 * ++ != 即可 18 // 19 20 class RangeIterator { 21 public: 22 explicit RangeIterator( long _var, long _step ) 23 : var( _var ), step( _step ) { 24 } 25 RangeIterator& operator++() { 26 var += step; 27 return *this; 28 } 29 long operator*() { 30 return var; 31 } 32 bool operator!=( const RangeIterator& other ) { 33 // 递减时自身大于对比值 34 if( step < 0 ) 35 return (this->var > other.var); 36 return (this->var < other.var); 37 } 38 private: 39 long var, step; 40 }; 41 42 43 // 44 // Range类只需要提供 beigin() end() 成员函数(返回迭代器) 45 // 46 explicit Range( long _begin, long _end, long _step = 1 ) 47 : begin_var( _begin ), end_var( _end ), step( _step ) { 48 } 49 RangeIterator begin() { 50 return RangeIterator( begin_var, step ); 51 } 52 RangeIterator end() { 53 return RangeIterator( end_var, step ); 54 } 55 56 private: 57 long begin_var, end_var, step; 58 };
之后测试下:
1 int main() 2 { 3 for( auto i : Range( 0, 10 ) ) { 4 printf( "%d ", i ); 5 } 6 7 printf( "\n" ); 8 for( auto i : Range( 0, 10,2 ) ) { 9 printf( "%d ", i ); 10 } 11 12 printf( "\n" ); 13 for( auto i : Range( 10, 0, -2 ) ) { 14 printf( "%d ", i ); 15 } 16 17 printf( "\n" ); 18 std::string str = "what the fuck?"; 19 for( auto i : Range( 0, str.size() ) ) { 20 printf( "%c ", str[i] ); 21 } 22 23 return 0; 24 }

浙公网安备 33010602011771号