导航

C++ 实现Range类,用于常规遍历

Posted on 2016-06-20 16:49  codetask  阅读(645)  评论(0)    收藏  举报

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 }