2012-08-14 2 views
8

におけるアルゴリズム、イテレータとコンテナの分離があります。どこでもテンプレートを大量に使用している場合は、テンプレートパラメータを使用してすべてのものを1つの場所に持つクラスを作成できます。なぜ彼らはC++ STLにアルゴリズム、イテレータとコンテナを分離している理由を私は理解できないC++ STL

私が得たいくつかのテキストは、イテレータはコンテナデータと対話するためのアルゴリズムを助けますが、どのような場合、容器は、それが持っているデータにアクセスするためのいくつかのメカニズムを公開することを説明して? + NアルゴリズムMコンテナと

+1

あなたが書いた単語は理解できませんでした。 : – Mehrdad

+0

私はコンテナやイテレータなどのクラスが違うので混乱の原因になって申し訳ありません。テンプレートを使用して1つのクラスにすべてを入れ、コンテナにデータがあり、それか、彼らは別々の?違うイテレータがあるなぜ私が意味する、アルゴリズムなどである理由 – Rahul

+3

[この質問](http://stackoverflow.com/questions/10380612/principles-behind-stl-design)はあなたにいくつかを与えるかもしれない。修正ポインタ[このインタビュー](http://www.sgi.com/tech/strd/drdobbs-interview.html)、STLの作成者であるAlex Stephanovにもいくつかの洞察が含まれています –

答えて

22

、一つは通常のコードのM * N枚が必要になりますが、「接着剤」として機能するイテレータで、これはコードのM + N枚に減少させることができます。

例:3つのコンテナ

std::list<int> l = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists 
std::vector<int> v = { 0, 2, 5, 6, 3, 1 }; // C++11 initializer lists 
std::array<int, 5> a = { 0, 2, 5, 6, 3, 1 }; 

auto l_contains1 = std::find(l.begin(), l.end(), 1) != l.end(); 
auto v_contains5 = std::find(v.begin(), v.end(), 5) != v.end(); 
auto a_contains3 = std::find(a.begin(), a.end(), 3) != a.end(); 

auto l_count1 = std::count(l.begin(), l.end(), 1); 
auto v_count5 = std::count(v.begin(), v.end(), 5); 
auto a_count3 = std::count(a.begin(), a.end(), 3); 

の実行2つのアルゴリズムにのみ、2つの異なるアルゴリズムを呼び出し、そして唯一の3つのコンテナのコー​​ドを持っています。各コンテナは、begin()end()イテレータをコンテナに渡します。答えを生成するコードは3 * 2行ですが、書かれる必要があるのは3 + 2の機能だけです。

より多くのコンテナとアルゴリズムでは、STLに5つのシーケンスコンテナ、8つの連想コンテナ、3つのコンテナアダプタがあり、ほぼ80のアルゴリズムが存在するコードでのコンビナトリアル爆発が大幅に減少します一人で<algorithm>で(でも<numeric>のものを数えていない)あなたが持っているということだけ16 + 80代わり16 * 80のように、コード内の13倍の減少! (もちろん、すべてのアルゴリズムがすべてのコンテナで意味をなさないわけではありませんが、その点は明確でなければなりません)。

反復子は5種類(入力、出力、順方向、双方向、およびランダムアクセス)に分けることができ、そしていくつかのアルゴリズムは、イテレータ機能に応じて特殊なバージョンに委譲します。これにより、コードの削減はいくらか軽減されますが、最適化されたアルゴリズムを選択して効率を大幅に改善します。 STLは、分離に完全に一致していないこと

注:std::list自体をソートするために、実装の特定の詳細を使用して独自sortメンバ関数を有し、そしてstd::stringが実装されている可能性が最もそのメンバ関数アルゴリズムの膨大な数を有します非メンバ関数として。

関連する問題