マップに同じ値を持つ複数のキーがあるとします。その場合、クエリに一致するすべてのキーを取得するにはどうすればよいですか。
または、find 操作で特定の値を検索するように指示する可能性はありますか。
私はstd::map
、C++を使用しています。
このようなものはあなたのために働きますか:
void FindKeysWithValue(Value aValue, list<Key>& aList)
{
aList.clear();
for_each(iMap.begin(), iMap.end(), [&] (const pair<Key, Value>& aPair)
{
if (aPair.second == aValue)
{
aList.push_back(aPair.first);
}
});
}
迅速なアクセスが必要で、より多くのスペースを使用することを気にしない場合は、値、キーとして保存される別のマップを維持します。あなたの場合、重複した値を処理する必要があります(キーとして保存します)。
素晴らしいアイデアではありませんが、間違いなくオプションです。
唯一の方法は、マップを反復処理することです。
このリンクが役に立つかもしれません:逆マップ検索
std::map<K, V>
キーがたまたま一意であり、選択したクエリが使用した順序関係と一致する可能性が高くない可能性があるため、連想コンテナーはおそらくあまり役に立ちません。順序が一致する場合は、std::map<K, V>
メンバーlower_bound()
とを使用できますupper_bound()
。を使用するstd::multimap<K, V>
こともできますequal_range()
。
一般に、つまり、クエリが実際には順序に関連していない場合はstd::copy_if()
、述語に一致する一連のオブジェクトを取得するために使用できます。
Other other;
// ...
std::vector<Other::value_type> matches;
std::copy_if(other.begin(), other.end(),
std::back_inserter(matches), predicate);
要素のコピーが高すぎる場合は、std:find_if()
代わりに次の使用を検討する必要があります。
for (auto it(other.begin());
other.end() != (it = std::find_if(it, other.end(), predicate));
++it) {
// do something with it
}
Amap
は、キーの効率的な検索を目的としています。値に基づくルックアップは効率的ではなく、基本的にマップを反復処理して、自分で一致を抽出する必要があります。
for(map<A,B>::iterator i = m.begin(); i != m.end(); i++)
if(i->second == foo)
you_found_a_match();
これを頻繁に行う場合は、別の方法でマルチマップ マッピングを構築できるため、値ベースのルックアップを効率的に実行できます。
multimap<B,A> reverse;
for(map<A,B>::iterator i = m.begin(); i != m.end(); i++)
reverse.insert(pair<B,A>(i->second,i->first));
指定された値を持つキーを簡単に見つけることができるようになりました。
matches = reverse.equal_range(value);
for(multimap<B,A>::iterator i = matches.first; i != matches.second; i++)
A & key = i->second;
これらのマップが継続的に拡大しない場合は、代わりに単純にベクターを維持し、値に基づいてコンパレーターを定義し、代わりに equal_range を使用する方が効率的です。