2012-11-02 40 views
0

假設我在地圖中具有多個具有相同值的關鍵字。那麼在那種情況下,我如何檢索與查詢匹配的所有密鑰。獲取與地圖中的查詢匹配的所有關鍵字

或者,是否有任何可能告訴查找操作在特定值之後進行搜索。
我正在使用一個std::map,C++。

+0

我懷疑你可能會混淆術語「價值」。據說地圖從按鍵映射到價值,但我認爲你說的是​​「按鍵的價值」中的價值,而不是「按鍵映射的價值」。如果是這種情況,如果您重複使用相同的密鑰兩次,則「std :: map」將覆蓋舊條目。 'std :: multimap'支持同一個鍵的多種用法。 – Yakk

回答

1

關聯容器可能不會幫助你太多,因爲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 
} 
2

將這樣的事情對你的工作:

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); 
     } 
    }); 
} 
+0

我建議在這裏使用'const pair &'。 – Mikhail

1

只要你想快速訪問,你不介意使用一些更多的空間,那麼你認爲,被存儲爲值,鍵另一個地圖。在你的情況下,你需要處理重複值(你將存儲爲關鍵字)。

不是一個好主意,但絕對是一種選擇。

0

A map用於有效查找密鑰。基於價值觀查找效率不高,而且你基本上通過地圖迭代,提取匹配自己:

如果你打算經常這樣做,你可以建立一個多重映射映射的其他方式,所以你如果這些地圖都不會長大

matches = reverse.equal_range(value); 
for(multimap<B,A>::iterator i = matches.first; i != matches.second; i++) 
    A & key = i->second; 

:可以有效地進行基於價值的查找:

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)); 

現在你可以很容易地找到與給定值值的鍵不斷地,簡單地維護矢量>可能更有效率,而是根據該值爲其定義比較器,並使用equal_range來代替。

相關問題