2016-10-06 9 views
2

oopの目的は、データ構造とアルゴリズムをマージして単一のエンティティを提供することです.STLはそれらを分離しますSTLはメンバー関数として自身のメソッドを書きませんでしたか?なぜSTLがデータ構造とアルゴリズムを分離するのですか

+10

Nアルゴリズム+ので、 M個のデータ構造は、N個のアルゴリズム* M個のデータ構造よりも少ないコードで書くことができます。 – milleniumbug

+2

ジェネリック関数がないため、あなた自身で作成する代わりに、誰でも使用できるalgoを書くのはいかがですか? – NathanOliver

+1

アルゴリズムをメンバ関数にすると、同様の振る舞いをする他のオブジェクトに対して、アルゴリズムを再利用することはできません。 – Galik

答えて

4

あなたが示唆されているものを実装を検討 - すべてのデータ構造は、すべてのアルゴリズムを再実装する必要があります:

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(/* ... */) { /* ... */ } 
    /* ... */ 
}; 

あなたが見ることができるように、厳しいコードの重複があります。また、新しいアルゴリズムを追加するには、すべてのコンテナの実装を変更する必要があるため、このアプローチはメンテナンス不可です。


UFCSrangesと並んで標準に受け入れされようとしている場合、あなたは彼らがメンバ関数だったかのように標準コンテナ上のアルゴリズムを呼び出すことができるようになります:

std::vector<int> v{/* ... */}; 
v.sort(); // Actually calls `std::sort(v)` thanks to UFCS. 
関連する問題