2017-11-20 25 views
1

私は以下のようにbuttonValuesというC++マップを持っています。C++マップは、2番目の要素がXのときに最初の要素を取得します

map<int, int> buttonValues; 

次のようにデータをマップに配置しました。私が何をしたいか

buttonValues.insert(std::pair<int, int>(0, 1)); 
buttonValues.insert(std::pair<int, int>(1, 3)); 
buttonValues.insert(std::pair<int, int>(2, 0)); 

は、2列目の値が0の検索で、0が2番目の列に発見された場合、最初の列の値を返します。

buttonValues.find(0)->second 

しかし、どのように私は値が最初に対応するのですか:この例では、私が返されることを希望値は、これまでのところ、私はこれで2番目の列に0を検索することができると信じて2です。カラム?

おかげ カルム

+1

{{1,0}、{2,0}、{3,0}} 'で' 0 'を検索するとき、アルゴリズムはどのように振舞うべきですか? '-1'を検索するときは? –

+0

何も見つかりませんでした。このコードはif文に渡されます。この問題が解決されると、if文は単に渡されます。 –

答えて

1

buttonValues.find(0)->secondはあなたに0をkeyに対応する値( "2列")を提供します。あなたの例では、それは1を返します。あなたが機能でこれを置くことができ

for (const auto& keyval : buttonValues) // Look at each key-value pair 
{ 
    if (keyval.second == 0) // If the value is 0... 
    { 
     return keyval.first; // ...return the first element in the pair 
    } 
} 

:あなたは、マップを反復し、値= 0探しし、キーを返す必要があります。マップには固有のキーがありますが、必ずしも一意の値である必要はありません。したがって、値が0の複数のキーがある場合は、おそらく処理する必要があります。このような

+0

素晴らしいです。ありがとう! –

1

何か:

for (auto X : map_name) 
    if (X.second == 0) 
    return X.first; 

std::pair<>は、マップに1列目と2列目の値を保持します。すべてのペアを反復して、必要な値の2番目の値をチェックするだけです。

0

実際にパフォーマンスの観点からは、地図から値でキーを検索することは推奨されていませんが、時間の複雑さは線形時間O(N)になります。地図からキーで値を検索すると、 'O(logN)'になります。逆マップを作成することも考えられます。multimap、またはunordered_map/unordered_multimapの場合も使用例に応じて異なります。

関連する問題