end()すべての反復で呼び出されるわけではないため、最初のものは高速です。いいえ、オプティマイザーはそれを簡単にキャッシュすることはできません。これは、この反復でコンテナーのサイズが変更されたかどうか (したがって、末尾が移動したかどうか) がわからないためです。これは、エイリアシングの問題により、const コンテナーにも適用されます。
i++i のコピーを返し、インクリメントします。++iインクリメントし、インクリメントされた値を返します。したがって、戻り値を破棄する場合は、++i必要な作業が少ない (コピーしない) ため、 を使用します。オプティマイザーはインラインi++呼び出しを修正する可能性が非常に高いため、同じくらい高速です++iが、それに依存しないでください。
自分?私が使う
for(int i = 0; i < m.size(); i++) {
// ... do something with m[i]
}
それは最短で最も明確だからです。なぜintではないのMyClass::size_typeですか?それはよりシンプルであり、これまでエッジケースについて心配する必要がなかったからです. なぜi++ですか?基本型の場合、常に に最適化され++i、同僚にとって混乱が少ないためです。おまけiとして、数値としても使用できます。イテレータを使用すると、別のカウンターを保持するか、std::distance.
obecalplistは、これがやなどの標準コンテナの半分では機能しないことを指摘していmapます。実際、それらは適切なイテレータを使用する必要があります。iteratorこれに関連して、ジェネリック コードを記述するときは常に を使用する必要があります。