2011-02-08 7 views
6

Así que he estado entrando en el nuevo C++ usando GCC 4.6 que ahora tiene bucles for-based. Encontré esto realmente bueno para iterar sobre matrices y vectores.C++ 0x manera de reemplazar los bucles de rango (int i ;;) por bucle for-0 basado en rango

Para principalmente razones estéticas me preguntaba si había una manera de utilizar esta opción para sustituir el estándar

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

con algo como

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

¿Hay algo de forma nativa integrada en el nuevo estándar de C++ que me permite hacer esto? ¿O tengo que escribir mi propia clase range/iterator?

+0

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

+0

posible duplicado de [¿Hay una clase de rango en C++ 11 para su uso con rango basado en bucles?] (http://stackoverflow.com/questions/7185437/is-there-a-range-class-in-c11-for-use-with-range-based-for-loops) –

Respuesta

4

No lo veo en ninguna parte. Sin embargo, sería bastante trivial:

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)); 
} 

debe hacer el truco (la parte superior de la cabeza; puede ser que necesite un poco de ajuste). El par de iteradores ya debería ser rango, por lo que creo que no debería necesitar definir el inicio y el final usted mismo.

+0

también conviértalo en plantilla en el tipo 'Integer'. –

+0

@Matthieu Sí, claro. La otra pregunta mencionada como duplicada anteriormente tiene algunas implementaciones más avanzadas. –

Cuestiones relacionadas