2010-11-24 14 views
25

マップのマップされた値(キーの代わりに)を検索してキーを返す方法はありますか?通常、値を取得するにはsomeMap.find(someKey)->secondを実行しますが、ここでは逆を行い、キー(値とキーはすべて一意です)を取得します。マップのマップされた値を見つける

+1

[キーと値の両方で検索するには良い方法がありますか?](http://stackoverflow.com/questions/3848483/is-there-a-good-way-to-search-by-両方のキーと値) –

+1

@Fred:リンクされた質問は決して答えを受け取ったことがなく、代わりに(その特定の必要性を満たすように見えたが、それはポイントではない)。 –

+0

[std :: map-C++で値をチェックする]の可能な複製があります(http://stackoverflow.com/questions/535317/checking-value-exist-in-a-stdmap-c) – CharlesB

答えて

26

mapがどのように設計されているかによって、順序付けられていないデータの検索と同等の処理が必要になります。

for (it = someMap.begin(); it != someMap.end(); ++it) 
    if (it->second == someValue) 
     return it->first; 
+0

同じことです。彼は - >を呼び出すのではなく、単にポインタの逆参照をしています。おそらく、まったく同じコードにコンパイルされます。 – Falmarri

+0

これはまさに必要なものかもしれませんが、コメントだけです:最初のキーを返します。これは 'someValue'への唯一のマッピングではないかもしれません。それが消去または変更されて次の検索で一致しなくても、begin()から反復を不必要に再開するのは良いことではありませんが、初期イテレータ値は関数の引数として渡すことができます。ポスターが出てくるような細部を探してほしいと思っています。 –

+0

@Falmarri私はそれが同じことを知っています、私はちょうどそのようにそれを行う特定の理由があるのだろうかと思っています。コードは 'it(arrow)key'と同じくらい読みにくいと思います:) – wrongusername

1
struct test_type 
{ 
    CString str; 
    int n; 
}; 


bool Pred(std::pair< int, test_type > tt) 
{ 
    if(tt.second.n == 10) 
     return true; 

    return false; 
} 


std::map< int, test_type > temp_map; 

for(int i = 0; i < 25; i++) 

{ 
    test_type tt; 
    tt.str.Format(_T("no : %d"), i); 
    tt.n = i; 

    temp_map[ i ] = tt; 
} 

auto iter = std::find_if(temp_map.begin(), temp_map.end(), Pred); 
+1

コードを説明してください。 – rjdkolb

2

我々は、キーに値をマップするreverseMapを作成することができます。

と同様に、

map<key, value>::iterator it; 
map<value, key> reverseMap; 

for(it = originalMap.begin(); it != originalMap.end(); it++) 
    reverseMap[it->second] = it->first; 

また、これは線形検索のような基本的ですが、あなたは、クエリの数を持っている場合に有用であろう。

関連する問題