2011-02-08 7 views
6

Quindi sono entrato nel nuovo C++ usando GCC 4.6 che ora ha for-loop basati su range. L'ho trovato davvero interessante per iterare su array e vettori.C++ 0x modo sostituire per (int i ;;) loop di gamma con ciclo for-based

Per lo più motivi estetici mi sono chiesto se ci fosse un modo per utilizzare questo per sostituire lo standard

for(int i = min; i < max; i++) {}

con qualcosa di simile

for(int& i : std::range(min, max)) {}

c'è qualcosa nativamente integrato nel nuovo standard C++ che mi permette di fare questo? O devo scrivere la mia classe range/iterator?

+0

Duplicato: http://stackoverflow.com/questions/1977339/c-range-xrange-equivalent-in-stl-or-boost – AFoglia

+0

possibile duplicato di [Esiste una classe di intervallo in C++ 11 da utilizzare con range based for loops?] (http://stackoverflow.com/questions/7185437/is-there-a-range-class-in-c11-for-use-with-range-based-for-loops) –

risposta

4

Non vedo da nessuna parte. Ma sarebbe piuttosto banale:

class range_iterator : public std::input_iterator<int, int> { 
    int x; 
public: 
    range_iterator() {} 
    range_iterator(int x) : x(x) {} 
    range_iterator &operator++() { ++x; return *this; } 
    bool operator==(const range_iterator &r) const { return x == r.x; } 
    int operator*() const { return x; } 
}; 
std::pair<range_iterator, range_iterator> range(int a, int b) { 
    return std::make_pair(range_iterator(a), range_iterator(b)); 
} 

dovrebbe fare il trucco (in cima alla mia testa, potrebbe essere necessario un piccolo ritocco). La coppia di iteratori dovrebbe già essere estesa, quindi credo che non sia necessario definire se iniziare e finire.

+0

Potresti anche renderlo modello sul tipo 'Integer'. –

+0

@ Matthieu Sì, certo. L'altra domanda menzionata come duplicata sopra ha alcune implementazioni più avanzate. –

Problemi correlati