Para cualquiera que lea esto ahora, la pregunta se ha convertido en algo discutible con C++ 11.
No estaba seguro de si esta respuesta califica como respuesta, porque en realidad no aborda el punto de la pregunta. Pero sí creo que es válido señalar que el problema planteado aquí rara vez se encontrará en la práctica para un programador de C++ 11, y ciertamente habría encontrado esta respuesta útil hace unos años. Por lo tanto, esta respuesta está dirigida al lector que simplemente quiere saber mejor forma de iterar a través de todos los elementos en un contenedor STL (vector
, list
, deque
, etc.)).
Suponiendo que el PO quería tener acceso a cada elemento en el contenedor, que puede eludir fácilmente toda la cuestión de si la definición end
es lo suficientemente rápido que llamar Container::end()
escribiendo un range-based for loop:
Container container; // my STL container that has been filled with stuff
// (note that you can replace Container::value_type with the value in the container)
// the standard way
for (Container::value_type element : container) {
// access each element by 'element' rather than by '*it'
}
// or, if Container::value_type is large
Container container; // fill it with something
for (Container::value_type& element : container) {
//
}
// if you're lazy
Container container; // fill it with something
for (auto element : container) {
//
}
El PO ha pedido si la compensación entre la brevedad de simplemente comparar it
a Container::end()
en cada iteración y el rendimiento de declarar una variable end
y compararla en cada paso vale la pena. Dado que los bucles for basados en rangos proporcionan una alternativa simple, fácil de escribir y fácil de leer que también ocurre, internamente, declarar un iterador end
en lugar de llamar al método Container::end()
en cada paso, el número de casos en los que necesitamos detenernos en este la pregunta se ha reducido a un número limitado de casos.
Según cppreference.com, el bucle for-basada gama producirá código con los mismos efectos secundarios como los siguientes:
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Como acotación al margen: Incluso iría para 'para (contenedor :: iterador it = large.begin(), end = large.end(); it! = end; ++ it) {...} 'para limitar el alcance de la variable' end' a solo for-loop. – haffax
C# y Java devs escriben este tipo de bucles para permitir que el JITer lo optimice (un cheque menos por iteración). Parece que no es el caso de C++. –
Desarrolladores de C++ simplemente escriba 'for_each (begin (c), end (c), []() {});' Loops son para escritores de librerías: P – MSalters