C++ STL でアルゴリズム、反復子、およびコンテナーを分離した理由がわかりません。どこでもテンプレートを頻繁に使用する場合は、テンプレート パラメータを使用してすべてのものを 1 か所にまとめたクラスを作成できます。
私が入手した一部のテキストでは、反復子はアルゴリズムがコンテナー データと対話するのに役立つと説明していますが、コンテナーが所有するデータにアクセスするための何らかのメカニズムを公開している場合はどうなるでしょうか?
C++ STL でアルゴリズム、反復子、およびコンテナーを分離した理由がわかりません。どこでもテンプレートを頻繁に使用する場合は、テンプレート パラメータを使用してすべてのものを 1 か所にまとめたクラスを作成できます。
私が入手した一部のテキストでは、反復子はアルゴリズムがコンテナー データと対話するのに役立つと説明していますが、コンテナーが所有するデータにアクセスするための何らかのメカニズムを公開している場合はどうなるでしょうか?
M
コンテナー +N
アルゴリズムの場合、通常はコードの断片が必要になりM * N
ますが、イテレーターが「接着剤」として機能することで、これM + N
をコードの断片に減らすことができます。
例: 3 つのコンテナーで 2 つのアルゴリズムを実行する
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 つの異なるアルゴリズムのみを呼び出しており、3 つのコンテナーのコードしかありません。各コンテナは、イテレータbegin()
とend()
イテレータをコンテナに渡します。3 * 2
回答を生成するためのコード行はありますが、3 + 2
記述する必要があるのは機能の一部だけです。
より多くのコンテナーとアルゴリズムの場合、この分離により、コードの組み合わせ爆発が大幅に削減されます。STL には 5 つのシーケンス コンテナー、8 つの連想コンテナー、3 つのコンテナー アダプターがあり、<algorithm>
単独でほぼ 80 のアルゴリズムがあります ( <numeric>
) にあるものを数えても、コードは 13 分の 1 に削減されます16 + 80
。16 * 80
(もちろん、すべてのアルゴリズムがすべてのコンテナーで意味をなすわけではありませんが、要点は明確です)。
イテレータは 5 つのカテゴリ (入力、出力、転送、双方向、ランダム アクセス) に分類でき、一部のアルゴリズムはイテレータの機能に応じて特殊なバージョンに委任されます。これにより、コードの削減はいくらか減少しますが、手元の反復子に最適なアルゴリズムを選択することで効率が大幅に向上します。
STL は分離において完全に一貫していないことに注意してください。実装固有の詳細を使用してそれ自体をソートするstd::list
独自のメンバー関数があり、膨大な数のメンバー関数アルゴリズムがあり、そのほとんどは非メンバー関数として実装できます。sort
std::string