2017-02-09 5 views
1

私はこのデータ構造を持っている:「クラスメンバーをキーとして設定」の最適なデータ構造ですか?

class foo { 
    class bar key; 
    … some_associated_values … 
}; 

私は今、これを使って何/ unordered_set /マップを構築したいです。私の問題は、C++ 14はセットのメンバーを見つけるためにキーを単独で使用することをサポートしていないので、unordered_setは外です。マップを使用するには、値クラスを分割するか、キーを複製する必要がありますが、どちらも既存のコードベースの侵入型リファクタリングを必要とします。

このようなマッピングの理想的なデータ構造は、std::pair<const class key&, class value>(値クラス内のキーを参照で置き換えることもできます)のようですが、初期化するにはどうすればよいでしょうか?

+0

unordered_set :: find()は完全な "foo"クラスで呼び出される必要があるため、この場合は役に立ちません。完全なコードはテンプレートを使用しています。私のコードは「クラスfoo」を初期化する方法を知らない(またはそれを気にする必要はない)。私はそれが空の初期化子を持つことを要求することはできません。 –

+1

_ "C++ 14では、キー自体を使用してセットのメンバーを検索することはサポートされていません。" –

+0

これは合法性とパフォーマンスの間で様々な程度の妥協を行うことができます。あなたは 'unique_ptr 'を保存できますか? 'foo'に仮想' bar&get_key() 'を持たせることができますか? –

答えて

2

私の問題は、C++ 14は、C++ 14あなたはstd::setなくstd::unordered_setを使用することができて

セットのメンバーを見つけるために、それ自体でキーを使用してサポートしていないということです( )順不同コンテナは異質のルックアップをサポートしていない理由は次のとおりです。

#include <set> 
#include <assert.h> 

struct bar { int i; }; 

bool operator<(const bar& l, const bar& r) { return l.i < r.i; } 

struct foo 
{ 
    bar key; 
    int val; 
}; 

struct cmp 
{ 
    using is_transparent = void; 

    bool operator()(const foo& l, const foo& r) const 
    { 
    return l.key < r.key; 
    } 

    bool operator()(const foo& l, const bar& r) const 
    { 
    return l.key < r; 
    } 

    bool operator()(const bar& l, const foo& r) const 
    { 
    return l < r.key; 
    } 
}; 

int main() 
{ 
    std::set<foo, cmp> s; 
    s.insert(foo{{0}, 1}); 
    s.insert(foo{{2}, 3}); 

    auto pos = s.find(bar{0}); 
    assert(pos != s.end()); 
    assert(pos->key.i == 0); 
    assert(pos->val == 1); 

    pos = s.find(bar{1}); 
    assert(pos == s.end()); 

    pos = s.find(bar{2}); 
    assert(pos != s.end()); 
    assert(pos->key.i == 2); 
    assert(pos->val == 3); 
} 

(PSそれはを使って何かを作ることpossibleです210仕事ですが、悪いですし、エラーが発生しやすくなります)

関連する問題