2013-05-29 46 views
17

ループでforeachループを反復すると、実行したテストでは、標準forループと同じ順序で項目が返されます。Qt foreachループ順序付けとQListの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"; 
} 
+0

リストで[i]演算子を使用することはできませんが、メモリにランダムアクセスするにはテーブル(vectors ...)でのみ使用できます。さらに、C++ 11 foreacループを試してください:((T&item:list){/ * some code * /})。これが助けることができるかもしれない – Krozark

+0

@ Krozarkいいえ、 '演算子[]'はうまく動作します。参照:http://qt-project.org/doc/qt-4.8/qlist.html#operator-5b-5d –

+0

@NikosC。 OKですが、STLにはありません。あなたの問題では、begin()とend()を使ってイテレータを使うのが最も効率的です(foreachマクロが何をしているのかわかりません...) – Krozark

答えて

27

foreachマクロが(別名。Q_FOREACH)容器のbegin()end()イテレータ要求メソッドを使用します。

コンテナがQListまたはQVectorの場合、例は常に同等です。 foreachソースコードhereを見ることができます。

foreachマクロは大したものではありませんが、コンテナのコピーを作成します。したがって、暗黙的共有をサポートするコンテナでのみ使用してください。可能であれば、C++ 11 for(:) {}ループを使用してください。そうでない場合は、Boostには同等のものがあります。

+0

ありがとう!これは多くの助けになります! –

3

foreachが、それは等価ではないことを示唆し、最初のものよりはるかに遅い、hereを発見しました。

+3

あなたは正しいですが、なぜ理解できません。これらのテストでは、最初の 'foreach'テストは、実際のコンテナデータのconst refを使用して、各反復で' QString'の浅いコピーを作成するため、非常に遅くなりました。他のテストは、浅いコピーをバイパスしたためです。逆に、 'ints'のリストを使うと同じ効果がありました。 – cmannett85

関連する問題