Buscar..


Buceando a través de un contenedor

En C ++, el bucle a través de un contenedor de secuencia c se puede hacer usando índices de la siguiente manera:

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

Aunque simples, tales escritos están sujetos a errores semánticos comunes, como un operador de comparación incorrecto o una variable de indexación incorrecta:

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

El bucle también se puede lograr para todos los contenedores que utilizan iteradores, con inconvenientes similares:

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11 introdujo rango basado en bucles y palabras clave auto , permitiendo que el código se convierta en:

for(auto& x : c) x = 0;

Aquí los únicos parámetros son el contenedor c y una variable x para mantener el valor actual. Esto evita los errores semánticos apuntados previamente.

De acuerdo con el estándar C ++ 11, la implementación subyacente es equivalente a:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

En dicha implementación, la expresión auto begin = c.begin(), end = c.end(); las fuerzas begin y end para ser del mismo tipo, mientras que el end nunca se incrementa, ni se elimina la referencia. Por lo tanto, el bucle for basado en rango solo funciona para contenedores definidos por un par iterador / iterador. El estándar C ++ 17 relaja esta restricción al cambiar la implementación a:

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

Aquí se permite que el begin y el end sean de diferentes tipos, siempre que se puedan comparar por desigualdad. Esto permite recorrer más contenedores, por ejemplo, un contenedor definido por un par iterador / centinela.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow