3

私はそのようなカスタムキーを持っていますstd::map:

struct Foo
{
    Foo(int _uid, int _priority) : unique_id(_uid), priority(_priority) {}

    bool operator<(const Foo& other) const {    
        return priority < other.priority;       
    }

    int unique_id;
    int priority;
};

私はこのコードでマップを作成しています:

std::map <Foo, int> bla;

そして、これは私がアイテムを挿入する方法です:

bla.insert(std::pair<Foo, int> (Foo(1,2), 3) )

これは正常に機能し、並べ替えも機能します。しかし、私の問題は、どうすれば だけでアイテムを見つけることができるかということunique_idです。find関数には が必要でFoo、これには が必要priorityですが、クエリを実行するときに持っていません。

優先度を(キーとしてではなく)値に保存したいのですが、その場合、値でソートする方法がわかりません。そのstd::mapための適切なクラス/テンプレートはありますか?

編集:ブーストを使用する機能がありません。優先順位も一意ではありません。

4

4 に答える 4

3

unique_id だけでアイテムを見つけるにはどうすればよいですか?

この質問の問題は、リストにFooクラスが含まれており、優先順位が付けられていることです。これにより、 による項目の検索が困難になりますunique_id

私が提案しているのは、新しいものを作成することですstd::map

std::map <int, foo> uniqueId_To_FooClass;

bla新しいアイテムに追加するときは、 に追加しuniqueId_To_FooClassます。fooそうすれば、クラスを見つけることができますunique_id

優先度を(キーとしてではなく)値に保存したいのですが、その場合、値でソートする方法がわかりません。std::map はそのための正しいクラス/テンプレートですか?

私が覚えている限りstd::map、キーでソートされたアイテムを通過するイテレータを提供します。ソートされたアイテムを値で調べ、マップを引き続き使用する唯一の方法は、キーと値を逆にして、コレクション全体を別のマップに書き換えることです。

こちらもご覧くださいOli Charlesworth answer

于 2013-09-01T08:13:48.877 に答える
2

線形検索に問題がない場合は、次を使用できますstd::find_if

auto it = std::find_if(bla.begin(), bla.end(), 
                       [given_id](std::pair<Foo, int> const & p)
                        {    
                            return p.first.unique_id== given_id;
                        });

if (it != bla.end() )
       //found

それが役立つことを願っています。

于 2013-09-01T08:19:26.033 に答える
1

std::map は正しい選択ではないと思います (優先順位は一意ですか?)。「Boost マルチインデックス コンテナ ライブラリ」( http://www.boost.org/doc/libs/1_54_0/libs/multi_index/doc/index.html )をお勧めします。

于 2013-09-01T08:14:42.067 に答える