2010-12-09 87 views
9

我正在使用Boost unordered_map。每個條目都有一個關鍵值對。我如何確定地圖中是否存在特定的值? (我不想創建另一個unordered_map,它將value存儲爲key和key的值)在unordered_map中查找值

謝謝。

回答

5

您需要遍歷unordered_map中的所有元素並查看給定值是否存在。

帶有自定義謂詞的std::find_if算法可用於簡化此操作。

+1

自定義謂詞?你需要的一切已經在STL中。 `compose1(bind2nd(equal_to (),value),select2nd >())` – ephemient 2010-12-09 05:22:43

+9

@ephemient:這既不簡單也不可讀。 (另外,select2nd是STL的一部分,不是C++標準庫的一部分) – 2010-12-09 05:24:28

+6

@ephemient:這是我見過的STL最糟糕的用途之一。 – 2010-12-09 07:59:37

7

Boost有Bimap,這是一個雙向映射(即,鍵和值都指向對方)。這聽起來比unordered_map更適合您的需求。

+0

不是說他們不想要反向地圖?雖然他們沒有理由爲什麼。 – ephemient 2010-12-09 05:23:05

9

如何如下:

typedef std::unordered_map<int,std::string> map_type; 
typedef std::unordered_map<int,std::string>::value_type map_value_type; 

map_type m; 

if (m.end() != find_if(m.begin(),m.end(),[](const map_value_type& vt) 
              { return vt.second == "abc"; } 
              )) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 

或者使用被捕獲的外部變量:

std::string value = "abc"; 
if (m.end() != find_if(m.begin(),m.end(),[&value](const map_value_type& vt) 
               { return vt.second == value; })) 
    std::cout << "Value found." << std::end; 
else 
    std::cout << "Value NOT found." << std::end; 
-3

爲什麼我們不能用計數方法,而不是找到的()

說明: 使用特定鍵計算元素 在容器中搜索鍵爲k的元素並返回找到的元素數。由於unordered_map容器不允許重複鍵,這意味着如果容器中存在具有該鍵的元素,該函數實際返回1,否則返回零。

unordered_map<int, int> hash; 
    //converted array into hashMap 
    for(int i=0; i<6; i++) 
    { 
     hash[i]; 
    } 

    //commom elemenest value is set to 1 in hashMap 
    for(int i =0; i<7; i++) 
    { 
     //element exist in array1 
     if(hash.count(i)) 
     { 
      hash[i] = 1; 
     } 
    }