Created
September 19, 2016 23:06
-
-
Save qgp9/50e2f06fa139bfbff7439e5948f45f48 to your computer and use it in GitHub Desktop.
pythonic range in C++11x
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <algorithm> | |
class Ranger { | |
public: | |
typedef int value_type; | |
struct iterator { | |
iterator(size_t counter) : counter(counter) {} | |
iterator operator++(){ return iterator(++counter); } | |
bool operator!=(iterator o) { return counter != o.counter; } | |
value_type operator*(){ return value_type{counter}; } | |
private: | |
value_type counter; | |
}; | |
Ranger(int begin, int end){ SetRange(begin,end); } | |
void SetRange( int begin, int end ){ | |
if( begin>end ){ | |
std::cout<<"begin("<<begin<<") must be smaller than end("<<end<<")"<<std::endl; | |
exit(1); | |
} | |
fBegin=begin;fEnd=end; | |
} | |
iterator begin(){ return iterator(fBegin); } | |
iterator end() { return iterator(fEnd+1); } | |
private: | |
int fBegin; | |
int fEnd; | |
}; | |
template< class T > | |
Ranger range( std::vector<T> & t, int begin=0, int end=-1 ){ return Ranger( begin, end<0?t.size()-1:end ); } | |
Ranger range( int end ){ return Ranger( 0, end-1 ); } | |
Ranger range( int begin, int end ){ return Ranger( begin, end ); } | |
using namespace std; | |
void testRange(){ | |
std::vector<int> vec = { 1, 2, 3, 4, 5 }; | |
for( auto i : range( 3 ) ) cout<< i <<", ";cout<<endl; | |
for( auto i : range( 1,3 ) ) cout<< i <<", ";cout<<endl; | |
for( auto i : range( vec ) ) cout<< i <<", ";cout<<endl; | |
for( auto i : range( vec, 2 ) ) cout<< i <<", ";cout<<endl; | |
} | |
int main(){ | |
testRange(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment