Normalmente, usted encontrará código AWL así:¿La inicialización del iterador dentro del bucle se considera un estilo incorrecto, y por qué?
for (SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin(); Iter != m_SomeMemberContainerVar.end(); ++Iter)
{
}
Pero de hecho tenemos la recomendación para escribir así:
SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
for (; Iter != IterEnd; ++Iter)
{
}
Si usted está preocupado acerca de alcance, agregar las llaves que encierran:
{
SomeClass::SomeContainer::iterator Iter = m_SomeMemberContainerVar.begin();
SomeClass::SomeContainer::iterator IterEnd = m_SomeMemberContainerVar.end();
for (; Iter != IterEnd; ++Iter)
{
}
}
Se supone que esto proporciona una ganancia de velocidad y eficiencia, especialmente si está programando consolas, porque no se llama a la función .end() en cada iteración del ciclo. Acabo de dar por supuesta la mejora en el rendimiento, parece razonable, pero no sé cuánto y sin duda depende del tipo de contenedor y la implementación real de STL en uso. Pero después de haber usado este estilo por un par de meses, de hecho, lo prefiero más que el primero.
El motivo es la legibilidad: la línea for es prolija y ordenada. Con los calificadores y las variables miembro en el código de producción real, es bastante fácil tener realmente largo para líneas si usa el estilo en el primer ejemplo. Es por eso que hice intencionalmente tener una barra de desplazamiento horizontal en este ejemplo, para que veas de lo que estoy hablando. ;)
Por otro lado, de repente se introducen las variables de Iter en el alcance exterior del bucle for. Pero entonces, al menos en el entorno en el que trabajo, el Iter habría sido accesible en el ámbito externo incluso en el primer ejemplo.
¿Cuál es su opinión sobre esto? ¿Hay algún pro para el primer estilo aparte de posiblemente limitar el alcance de Iter?
Derecha. Y C++ 0x introducirá la palabra clave de palabras clave recientemente renovada que nos permitirá evitar la declaración del iterador. Tenga en cuenta que supongo que su código no se compilará debido a la segunda declaración "SomeClass :: SomeContainer :: iterator". Debería ser para (m :: iterator i = ..., iEnd = ... – paercebal
@paercebal: Corregido, gracias –