簡體   English   中英

boost :: unordered_map被…命令了嗎?

[英]boost::unordered_map is… ordered?

我有一個boost :: unordered_map,但是它看起來是有條不紊的,給我一種壓倒性的“你做錯了”的感覺。 為什么輸出到此順序? 我期望底層的哈希算法將這個順序隨機化:

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

int main()
{
    boost::unordered_map<int, int> im;

    for(int i = 0; i < 50; ++i)
    {
        im.insert(std::make_pair(i, i));
    }

    boost::unordered_map<int, int>::const_iterator i;

    for(i = im.begin(); i != im.end(); ++i)
    {
        std::cout << i->first << ", " << i->second << std::endl;
    }

    return 0;
}

...給我...

0, 0
1, 1
2, 2
...
47, 47
48, 48
49, 49

在檢查boost的源代碼后:

inline std::size_t hash_value(int v)
{
    return static_cast<std::size_t>(v);
}

...這將解釋它。 下面的答案也具有更高層次的思考,我認為這很有用。

雖然我不是C ++人士,但我無法與boost內部交流,但我可以提出一些更高級的問題,以減輕您的擔憂:

1)“無序”地圖的保證是什么? 假設您有一個訂購的地圖,並且想要創建一個不保證訂購的地圖。 初始實現可以簡單地使用有序映射。 提供比您的廣告更強大的保證幾乎從來不是問題。

2)哈希函數是對X-> int進行哈希處理的東西。 如果已經有整數,則可以使用identity函數。 盡管它可能並非在所有情況下都是最有效的,但它可以解釋您所看到的行為。

基本上,看到這樣的行為不一定是問題。

可能是因為您的哈希是小整數。 哈希表通常按以下方式計算放置項的存儲桶的數量: bucket_index = hash%p其中p是質數,這是哈希表存儲桶的數量,其大小足以提供低頻率的沖突。

對於整數,hash等於整數的值。 您有很多數據,因此哈希表會選擇一個較大的p。 對於任何大於i的p, bucket_index = i%p = i

進行迭代時,哈希表按其索引的順序從其存儲桶中返回項目,這對您來說是鍵的順序。 :)

如果要查看隨機性,請嘗試使用較大的數字。

您做對了。 unordered_map不聲稱具有隨機順序。 實際上,它對順序沒有任何要求。 您不應該在順序方面期待任何東西,這會造成混亂!

這是因為默認情況下,地圖按“鍵的插入順序”排序。 嘗試添加隨機鍵值並查看結果。 每次都不一樣,應該不一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM