Qt foreach loop ordering for for loop для QList
При повторении с помощью цикла QList<T>
с циклом foreach
в тестах, которые я провел, элементы возвращаются в том же порядке, что и стандартный цикл for
.
Мой вопрос: будет ли foreach
всегда возвращать элементы в числовом порядке по индексу, подобному этому, для контейнеров с естественным упорядочением (например, QList
и QVector
)? Например, следующие всегда эквивалентны?
QList<T> list;
for( int i=0; i<list.count(); ++i )
{
// process items in numerical order by index
// do something with "list[i]";
}
foreach( T item, list )
{
// will items always be processed in numerical order by index?
// do something with "item";
}
Ответы
Ответ 1
Макрос foreach
(aka. Q_FOREACH
) использует методы запроса итератора begin()
и end()
контейнера.
Итак, если ваш контейнер является QList
или QVector
, ваши примеры всегда будут эквивалентны. Вы можете просмотреть foreach
исходный код здесь.
Макрос foreach
невелик, но он делает копию контейнера - поэтому используйте только те контейнеры, которые поддерживают неявное совместное использование. Используйте С++ 11 for( : ) {}
, если доступно, в противном случае Boost имеет эквивалент, который превосходит.
Ответ 2
На основе найденной информации здесь, foreach
намного медленнее первого, что говорит о том, что оно не эквивалентно.