Realmente no importa. Las probabilidades son que si su programa es lento, este no es el problema. Sin embargo, se debe tener en cuenta que no se hace una comparación completamente igual.Qt de foreach
es más similar a este (este ejemplo utilizará QList<QString>
):
for(QList<QString>::iterator it = Con.begin(); it != Con.end(); ++it) {
QString &str = *it;
// your code here
}
La macro es capaz de hacer esto mediante el uso de algunas extensiones del compilador (como GCC de __typeof__
) para obtener el tipo de contenedor pasado. También imagina que el impulso BOOST_FOREACH
es muy similar en concepto.
La razón por la que su ejemplo no es justo es porque su versión que no es Qt está agregando trabajo adicional.
Está indexando en lugar de realmente iterar. Si está utilizando un tipo con asignación no contigua (sospecho que este podría ser el caso con QList<>
), la indexación será más cara ya que el código tiene que calcular "dónde" está el n-ésimo elemento.
Dicho eso. Es todavía no importa. La diferencia de tiempo entre esas dos piezas de código será insignificante si existe en absoluto. No pierdas tu tiempo preocupándote por eso. Escriba lo que encuentre más claro y comprensible.
EDIT: Como beneficio adicional, actualmente estoy firmemente a favor de la versión C++ 11 de iteración recipiente, es limpia, concisa y simple:
for(QString &s : Con) {
// you code here
}
Sólo una pequeña nota que si usted no planea en la modificación de la variable de bucle foreach, se debe utilizar un QString y en su lugar - que tiene implicaciones en velocidad también. – swongu
Aquí hay una explicación de por qué quiere tener cuidado para incluir la const: http://labs.qt.nokia.com/2009/01/23/iterating-efficiently/ –
La adición importante a esta pregunta es que usted debe nunca use Qt 'foreach' para contenedores que no sean Qt, lo más probable es que se realice una copia profunda y esto es lo que no quiere, incluso sin crear un perfil de antemano. – Predelnik