Al iterar sobre elementos de un vector, se prefiere utilizar iteradores en lugar de un índice (consulte Why use iterators instead of array indices?).Obtener un índice en un vector utilizando Iterators
std::vector<T> vec;
std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
// do work
}
Sin embargo, puede ser necesario utilizar el índice en el cuerpo del bucle. ¿Cuál de los siguientes sería preferible en ese caso, teniendo en cuenta el rendimiento y la flexibilidad/extensibilidad?
- Revertir al bucle indexada
std::vector vec; size_t i; for (i = 0; i < vec.size(); ++i) { // use i }
- Calcular compensado
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = it - vec.begin(); // use i }
- uso std :: distancia
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = std::distance(vec.begin(), it); // use i }
Olvidé mencionar el rendimiento, generalmente es seguro asumir que el ciclo indexado tendría un mejor rendimiento, pero el rendimiento sería muy similar en ambos casos. – Guvante
No puedo decir que estoy de acuerdo. El cuerpo del ciclo puede contener otro código que desreferencia al iterador. Los iteradores no están diseñados para simplificar el código, sino que hacen que el código sea más genérico. Al usar los iteradores, puede intercambiar el vector por la lista y aún así funcionaría. – QBziZ
Además, std :: map o std :: set iterators están lejos de ser estúpidos. Si bifurcara todas las teclas posibles, probablemente llevaría una eternidad. Además, tendría que hacer una búsqueda O (log (n)) en cada tecla. Entonces mi ciclo tomaría O (m * log (n)). Usando un iterador, podría recorrer la colección en el tiempo O (n). –