2013-05-29 192 views
17

當循環通過QList<T>foreach循環時,在進行的測試中,項目以與標準for循環相同的順序返回。Qt foreach循環排序與for循環for QList

我的問題是,foreach總是按類似索引的數字順序返回物品,對於具有自然排序的容器(如QListQVector)?例如,以下總是等效?

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"; 
} 
+0

您不能在列表中使用[i]運算符,但只能在表(向量...)中使用內存中的隨機訪問。此外,請嘗試C++ 11 foreac循環:(for(T&item:list){/ * some code * /})。可能是這樣可以幫助 – Krozark

+0

@Krozark Nope,'operator []'工作得很好。請參閱:http://qt-project.org/doc/qt-4.8/qlist.html#operator-5b-5d –

+0

@NikosC。好的,但不是在STL中。所以對於你的問題,最有效的是使用迭代器使用begin()和end()(我真的不知道foreach宏是什麼...) – Krozark

回答

27

foreach宏(又名Q_FOREACH)使用容器的迭代器請求方法begin()end()

因此,如果您的容器是QListQVector那麼您的示例將始終等效。您可以查看foreach源代碼here

foreach宏雖然不是很好,但它使容器的副本 - 所以只能用於支持隱式共享的容器。如果可用,使用C++ 11 for(:) {}循環,否則Boost具有優越的等價物。

+0

謝謝!這有助於很多! –

3

基於該信息中發現hereforeach比第一慢得多,這表明它是不等價的。

+3

你是對的,但你還沒有明白爲什麼。在那些測試中,由於在每次迭代中創建了一個「QString」淺拷貝,所以* first *'foreach'測試非常慢,使用實際容器數據的const ref使時間迴歸到大致相同其他測試,因爲它繞過了淺拷貝。相反地​​,使用'ints'列表會產生同樣的效果。 – cmannett85