2
oopの目的は、データ構造とアルゴリズムをマージして単一のエンティティを提供することです.STLはそれらを分離しますSTLはメンバー関数として自身のメソッドを書きませんでしたか?なぜSTLがデータ構造とアルゴリズムを分離するのですか
oopの目的は、データ構造とアルゴリズムをマージして単一のエンティティを提供することです.STLはそれらを分離しますSTLはメンバー関数として自身のメソッドを書きませんでしたか?なぜSTLがデータ構造とアルゴリズムを分離するのですか
あなたが示唆されているものを実装を検討 - すべてのデータ構造は、すべてのアルゴリズムを再実装する必要があります:
template <typename T>
class vector
{
auto for_each(/* ... */) { /* ... */ }
auto partition(/* ... */) { /* ... */ }
auto sort(/* ... */) { /* ... */ }
/* ... */
};
template <typename T>
class list
{
auto for_each(/* ... */) { /* ... */ }
auto partition(/* ... */) { /* ... */ }
auto sort(/* ... */) { /* ... */ }
/* ... */
};
template <typename TK, typename TV>
class map
{
auto for_each(/* ... */) { /* ... */ }
auto partition(/* ... */) { /* ... */ }
auto sort(/* ... */) { /* ... */ }
/* ... */
};
あなたが見ることができるように、厳しいコードの重複があります。また、新しいアルゴリズムを追加するには、すべてのコンテナの実装を変更する必要があるため、このアプローチはメンテナンス不可です。
UFCSがrangesと並んで標準に受け入れされようとしている場合、あなたは彼らがメンバ関数だったかのように標準コンテナ上のアルゴリズムを呼び出すことができるようになります:
std::vector<int> v{/* ... */};
v.sort(); // Actually calls `std::sort(v)` thanks to UFCS.
Nアルゴリズム+ので、 M個のデータ構造は、N個のアルゴリズム* M個のデータ構造よりも少ないコードで書くことができます。 – milleniumbug
ジェネリック関数がないため、あなた自身で作成する代わりに、誰でも使用できるalgoを書くのはいかがですか? – NathanOliver
アルゴリズムをメンバ関数にすると、同様の振る舞いをする他のオブジェクトに対して、アルゴリズムを再利用することはできません。 – Galik