Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Qt foreach loop ordering vs. for loop for QList

When iterating through a QList<T> with a foreach loop, in the tests I conducted the items are returned in the same order as they are with a standard for loop.

My question is, will the foreach always return items in numerical order by index like this, for containers that have natural ordering (like QList and QVector)? For example, are the following always equivalent?

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";
}
like image 900
Freedom_Ben Avatar asked May 29 '13 23:05

Freedom_Ben


2 Answers

The foreach macro (aka. Q_FOREACH) uses the begin() and end() iterator request methods of the container.

So if your container is a QList or QVector then your examples will always be equivalent. You can view the foreach source code here.

The foreach macro isn't great though, it makes a copy of the container - so only use on containers that support implicit-sharing. Use C++11 for( : ) {} loops if available, otherwise Boost has an equivalent that is superior.

like image 52
cmannett85 Avatar answered Nov 05 '22 05:11

cmannett85


Based on the information found here, foreach is much slower than the first, suggesting that it is not equivalent.

like image 24
Krozark Avatar answered Nov 05 '22 06:11

Krozark