在Nocolai Josuttis的"标准图书馆"一书中,下面的粗体句子对我来说并不清楚

Wak*_*zil 3 c++ standard-library c++11

我正在阅读Nicolai Josuttis撰写的第二版"标准图书馆".在第183页我们有:

使用无序地图和Multimaps的示例

提出了179页的屈德宁的例子也适用于一个无序多重映射如果更换mapunordered_map在include指令,并multimap通过unordered_multimap在容器的声明:

#include <unordered_map>
...
unordered_multimap<int,string> coll;
...
Run Code Online (Sandbox Code Playgroud)

唯一的区别是元素的顺序是不确定的. 但是,在大多数平台上,元素仍将被排序,因为作为默认哈希函数,使用模运算符.

我粗略地强调了我不清楚的部分.当我读到这篇文章时,我的第一印象是作者说两个程序(第179页中的一个,见下文)和上面的程序都应该在大多数平台上以相同的顺序打印城市的名称.但这不会发生在clang和GCC中.看到活生生的实例map,并unordered_map在海湾合作委员会.在clang中获得相同的结果.

经过一段时间的思考,我解释了作者的说法,几乎所有平台都以相同的顺序打印城市的名称,当用a处理时unordered_map,输出似乎证实了这一点.但即便如此,我也很难接受这种解释,因为不同的实现可能会使用不同的哈希函数!

下面,您将在上面提到的第179页中找到示例:

#include <map>
#include <string>
#include <iostream>
using namespace std;
int main()
{
    multimap<int,string> coll; // container for int/string values
    // insert some elements in arbitrary order
    // - a value with key 1 gets inserted twice
    coll = { {5,"tagged"},
             {2,"a"},
             {1,"this"},
             {4,"of"},
             {6,"strings"},
             {1,"is"},
             {3,"multimap"} };
    // print all element values
    // - element member second is the value
    for (auto elem : coll) {
        cout << elem.second << ’ ’;
    }
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

Per*_*xty 6

我认为这充其量只是无益的.

常见的默认哈希函数int是使用int自身而不做任何更改.因此,如果散列表具有比最大整数更多的桶,并且以相同的顺序添加重复,则大多数实现将(按意外)以排序的顺序输出对.

然而,通常对于具有某种排序的对象,如果A <B.H(.)是散列函数,则不是H(A)<H(B)的情况.一般情况下,MAX(H(X))<=铲斗数也不是这样.

所以这本书真的指出了一个相当人为的特殊案例的特征.为什么我认为那是无益的?提出人为特殊情况的偶然属性可能会不小心引导读者认为它们是一些更广泛特征的例子.

哈希映射中的条目不会以任何有用的顺序返回.它们不会按顺序返回.它们不会以反向插入顺序返回.它们不按排序顺序返回.他们不会以任何顺序回来.[Sam我是].

如果一个例子是值得的,它将是一个例子,他们不回来订购.

  • 我认为这本书试图指出,仅仅因为你可能在一个尝试`unordered_map`的简单例子中获得有序值,但这并不意味着你可以依赖它. (3认同)