1

对于我的程序,我需要有无序键。为了完成工作,我使用 std::unordered_map 容器。这是一个测试代码:

#include <iostream>
#include <unordered_map>
#include <string>

int main()
{
    std::unordered_map<std::string, int> toto;

    toto["Outlook"] = 454;
    toto["Temperature"] = 4;
    toto["Humidity"] = 554;
    toto["Wind"] = 545454;

    std::unordered_map<std::string, int>::iterator It = toto.begin();

    std::cout << toto.size() << std::endl;

    for (; It != toto.end(); ++It)
        std::cout << (*It).first << std::endl;
    getchar();
    return (0);
}

在 Windows(Visual Studio 2012)上,输出为:

Outlook
Temperature
Humidity
Wind

这是正确的。未应用任何排序。

但在 Linux 上,输出如下:

Humidity
Outlook
Wind
Temperature

PS:在 linux 上,我使用 -std::c++0x 和 -std=gnu++0x 编译我的程序,并且没有编译错误。

那么,同一个程序怎么可能有不同的行为呢?在此先感谢您的帮助 !

4

2 回答 2

7

unordered_map通常(实际上总是读取)使用哈希表实现,默认情况下使用哈希表std::hash来选择将项目放入哪个存储桶。

有许多不同的散列函数,所以您看到的是std::hashWindows 和 Linux 上的两个不同的标准库实现使用两个不同的散列函数——它们产生不同的散列码——这反过来产生不同的存储桶位置,因此当迭代。

如果你不明白这是什么意思,我一般会花一些时间研究哈希表数据结构。在编程的许多方面,散列是一个非常酷且有用的数学工具。

于 2013-09-06T13:38:02.597 回答
4

正如名称 (unordered_map) 所暗示的 - 容器是无序的。没有人对项目的顺序以及真正的顺序做出任何保证 - 每个实现都有不同的顺序。

于 2013-09-06T13:30:24.843 回答