C++
Comparaciones lado a lado de ejemplos clásicos de C ++ resueltos a través de C ++ vs C ++ 11 vs C ++ 14 vs C ++ 17
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.