可能な限り最も軽量なソリューションを求める場合は、イテレータベース/コールバックベースのアプローチをお勧めします。
サプライヤの使用パターンは、コンシューマによって切り離されているためです。
特に、オブジェクトをコピーするのではなく、(N)RVOに移動したり移動したりする可能性がある場合でも、結果をコレクションにスラミングすると、完全な容量のコンテナ。
編集:優れほかに「義務論文」(そうでないなら、あなたは物事を理解したいならば、彼らはちょうど非常に便利です):デイブ・エイブラハムズWant Speed? Pass By value。
今
消費者がは、すべての要素を含むコレクションを望んでなかった場合は、イテレータ・インターフェースは、まだ単に優れていることに注意してください。
std::vector<myElementType> v(myType.begin(), myType.end());
// look: the client gets to _decide_ what container he wants!
std::set<myElementType, myComparer> s(myType.begin(), myType.end());
は、そうでない場合は、この柔軟性を取得してください。最後に、スタイルのいくつかの要素が
あります性質上
それはイテレータを使用して要素に(定数)の参照を公開するのは簡単です。これにより、オブジェクトのスライスを回避し、クライアントが要素を多態的に使用できるようにすることがはるかに容易になります。
イテレータスタイルのインターフェイスは、逆参照時に非const参照を返すためにオーバーロードされる可能性があります。
for (auto& slot : myType)
{
doProcessing(slot);
}
:あなたは範囲ベース-のためのC++ 11であなたには、いくつかのシンタックスシュガーを持つことができるの要件に準拠している場合、コンテナが返される、(直接)
を参照を含めることができませんでした
最後に、(上記のように)一般的な意味では、イテレータは標準ライブラリとうまく機能します。
コールバックスタイル(と同様に出力イテレータスタイルは)(つまり、あなたが反復を途中で中止し、戻り値を使用することができ、あなたが割り当てることなく処理を行うことができますイテレータのスタイルの多くの利点を持っていますすべての要素のコピーが前面に表示されています)。しかし、使用するにはやや柔軟性が低いようです。もちろん、特定の使用パターンを奨励する状況があるかもしれませんが、これは良い方法です。
Yikes、この質問へのコメントが消えました! 「義務的な論文」へのリンクがあるコメントが1つありました。誰でもリンクを再度投稿できますか?ありがとう! –
@ChristianAmmer私はそれが[this one](http://c2.com/cgi/wiki?PrematureOptimization)でした。しかし、同じテーマの周りにいくつかの "精神的な作品"周りに浮かんでいる。 – sehe