2013-06-26 90 views
0

在我看來,boost :: unordered_map總是檢查您正在查找的密鑰和存儲桶中的密鑰之間是否相等,即使密鑰散列到存儲桶中只有一個項目。這是安全的,表格可能已經用不同的鍵構建,然後你正在查找什麼,並且你正在查找的鍵可能與用於構建表的先前鍵之一相沖突。如果桶中只有一個項目,可以提升unordered_map或其他散列表,跳過相等比較嗎?

但是,假設我知道我將查找哪些密鑰,並且如果桶中只有一個密鑰,我想跳過相等檢查。這是我可以保證,我只會查找我以前插入到地圖中的鍵。有沒有一種方法可以跳過等式檢查,或者是否存在其他一些哈希表實現?

下面是示例代碼我寫了一個指示增壓:: unordered_map是檢查是否相等如果只有一個項目:

#include <iostream> 
#include <boost/unordered_map.hpp> 

typedef void (*dispatchFunction)(); 

void dispatchA() { std::cout << "A" << std::endl; } 
void dispatchB() { std::cout << "B" << std::endl; } 

template<class T> 
struct myequal_to { 
    bool operator()(const T &a, const T &b) const { 
    std::cout << "myequal_to: " << a << " " << b << std::endl; 
    return a==b; 
    } 
}; 

void unordered_map_example() { 
    typedef boost::unordered_map<std::string, dispatchFunction, 
         boost::hash<std::string>, 
         myequal_to<std::string> > mymap_t; 
    mymap_t mymap; 
    mymap["eventA"]=dispatchA; 
    mymap["eventB"]=dispatchB; 

    mymap_t::size_type max_elements_in_a_bucket = 0; 
    for (mymap_t::size_type bucket = 0; bucket < mymap.bucket_count(); ++bucket) { 
    max_elements_in_a_bucket = std::max(max_elements_in_a_bucket, 
             mymap.bucket_size(bucket)); 
    } 
    std::cout << "number of buckets: " << mymap.bucket_count() 
      << " max per bucket: " << max_elements_in_a_bucket << std::endl; 

    dispatchFunction foo = mymap["eventA"]; 
    foo(); 
} 

int main() { 
    unordered_map_example(); 
    return 0; 
} 

我的輸出顯示myequal到被稱爲:

桶的數量:每個桶最多11個:1 myequal_to:eventA eventA A

回答

1

如果可能存在衝突(因此需要桶中有多個元素),那麼您必須檢查散列因爲您發現的唯一元素可能會與目標發生衝突,而不是是目標的。我想如果你正在尋找一個已知在表中的密鑰,並且只做搜索找到它,你可以跳過比較。

+0

+1並回答標題問題:不。這些容器是用於一般用途的,並且遠遠沒有正常使用情況來獲得這種保證。人們當然可以編寫自定義散列和自定義相等比較函數來管理散列和相等性檢查的狀態,但這是一個巨大的混亂。簡單的做平等檢查...... – GManNickG

+0

謝謝,我不這麼認爲,但是想檢查是否存在代碼。 – MrCartoonology

+0

@ user2280020:有散列沒有桶列表,因爲散列值保證不會相互衝突。參見[完美哈希函數](http://en.wikipedia.org/wiki/Perfect_hash_function) –

相關問題