2010-12-06 7 views
7

重複の可能性:
Checking value exist in a std::map - C++
How to traverse a stl map/vector/list/etc?検索は::マップ

こんにちは、

はSTDに特定の値を検索することが可能です: :マップ、キーを知らない?私はマップ全体を反復して値を比較することができますが、stdアルゴリズムから関数を使用することは可能ですか?

+1

'std :: map'の場合は、反復処理が必要です。それ以外の場合は、 'boost :: bimap'を使用してください - http://stackoverflow.com/questions/535317/checking-value-exist-in-a-stdmap-c – birryree

+0

このリンクは、マップをトラバースする方法を示しています。^^^ –

答えて

4

これは役に立ちますか? STL find_if

operator()の関数ポインタまたはオブジェクトのいずれかの述語を実装する必要があります。前記述語はただ1つのパラメータを取るべきである。

8

Boost.Bimapを使用すると、値とインデックスの両方にインデックスを付けることができます。これまたは類似のものがなければ、これはブルートフォース(=>手でmapをスキャン)で行わなければなりません。

Boost.Bimapは、C++用の双方向マップ ライブラリです。 Boost.Bimapを使用すると、 は両方のタイプをキーとして使用できる に関連するコンテナを作成できます。

+0

+ 1。また、あなたのコードでBoostを使用することが許されない場合は、2つの対向するSTLマップを使用することもできます。 – Stas

+1

@Stas - 本当ですが、これはより多くの作業に役立ちます - 「Boostを使用できない」人には、いつもの応答はとにかくヘッダーをダウンロードし、必要なコードを抽象化することです。 –

2

標準機能(たとえば、std::find_if)を使用してこれを行うには厄介な方法がありますが、それでもマップ全体を反復する必要があります。 Boost.Bimapは両方向で効率的なインデックス作成を提供し、さらにBoost.Multi-Indexで行くことができます。

12

さて、あなたはstd::find_ifを使用することができます。

int main() 
{ 
    typedef std::map<int, std::string> my_map; 

    my_map m; 
    m.insert(std::make_pair(0, "zero")); 
    m.insert(std::make_pair(1, "one")); 
    m.insert(std::make_pair(2, "two")); 

    const std::string s("one"); 
    const my_map::const_iterator it = std::find_if(
     m.begin(), m.end(), boost::bind(&my_map::value_type::second, _1) == s 
    ); 
} 

しかし、それが手作りのループよりも少しだけましだ:それはまだO(n)です。

+0

バインドで素晴らしいアイデア! –

+0

私はboost :: bindの使い方を理解するのに時間が必要でした。誰かがそれらを必要とする場合、いくつかのポインタがあります:[Binding Member Variables](http://www.boost.org/doc/libs/1_65_1/libs/phoenix/doc/html/phoenix/modules/bind/binding_member_variables.html)と[オーバーロードされた演算子](http://www.boost.org/doc/libs/1_65_1/libs/bind/doc/html/bind.html#bind.purpose.overloaded_operators_new_in_boos) – guini