2010-10-13 53 views
3

我如何尋找一個std :: unordered_set知道散列值和有一些謂詞對象? (通過pred(x) && pred(y)確定等價關係的謂詞x == y。)搜索的std ::通過哈希值unordered_set和謂語

+0

pred(x)&& pred(y)等價於x == y。這意味着至多存在一個pred(x)可能存在的不同對象:)也許你有一個錯字? – 2010-10-13 12:13:54

+0

不,這意味着,至多存在一個給定類型的對象,謂詞對它是真實的:)。夥計們,我們已經找到了Singleton的數學公式:D – 2010-10-13 12:24:49

+1

是不是說只要2個對象滿足謂詞它們是相等的(由運算符'=='定義)?像在C++中一樣閱讀'=='而不是數學(儘管'=='是等價關係BTW)。 – 2010-10-13 13:11:27

回答

3

那麼,您可以忽略散列值並重複測試謂詞的整個unsorted_set。不是理想的效率,因爲你更願意只迭代一個桶,但它會按照你的要求。

標準unordered_set具有接口begin(size_t)以獲取特定桶(數均)的迭代器,和接口bucket_count()得到桶的數量。

對象與給定的哈希值,保證所有出現在同一個桶,所以迭代剷鬥測試謂詞夠你想要做什麼。

我不能真正看到的任何標準,以保證正確的桶迭代是hash_value % bucket_count()。有一個函數來獲取桶給定對象,而不是獲得桶對於給定哈希值。儘管如此,請嘗試一下:我認爲這是一個合理的猜測,我可能只是未能找到標準中的關鍵限制。

總之,我覺得你想要的東西,如:

size_t bucket = hash_value % myset.bucket_count(); 
find_if(myset.begin(bucket), myset.end(bucket), pred); 

,但我不知道。

+0

我想過這個問題,但沒有我發現保證桶'HASH_VALUE%myset.bucket_count();'。 – 2010-10-13 16:55:44

+0

恥辱。也許你需要使用hash_value - > object的multimap,而不是unordered_set。我想知道是否有人接近TR1和/或C++ 0x設計過程寫了這個。 – 2010-10-13 18:51:21

+0

我使用'unordered_map',但我相信它不是很好,因爲它基本上是我查找不映射(不提及使用哈希對象兩次)的對象集。 – 2010-10-16 11:21:11