stdext::hash_map 不清楚散列函数

Posted

技术标签:

【中文标题】stdext::hash_map 不清楚散列函数【英文标题】:stdext::hash_map unclear hash function 【发布时间】:2013-07-08 14:09:51 【问题描述】:
#include <iostream>
#include <hash_map>

using namespace stdext;
using namespace std;

class CompareStdString

public:
bool operator ()(const string & str1, const string & str2) const
    
        return str1.compare(str2) < 0;
    
;
int main()

    hash_map<string, int, hash_compare<string, CompareStdString> > Map;
    Map.insert(make_pair("one", 1));
    Map.insert(make_pair("two", 2));
    Map.insert(make_pair("three", 3));
    Map.insert(make_pair("four", 4));
    Map.insert(make_pair("five", 5));
    hash_map<string, int, hash_compare<string, CompareStdString> > :: iterator i;
    for (i = Map.begin(); i != Map.end(); ++i)
    
        i -> first; // they are ordered as three, five, two, four, one
    
    return 0;

我想使用 hash_map 将 std::string 作为键。但是当我插入下一对订单时,我会感到困惑。为什么订单与插入订单不匹配?一二三四五怎么下单??

【问题讨论】:

这引发了一个问题,为什么你不使用std::unordered_map ... 我认为std::map&lt;int, std::string&gt; 会按您想要的方式订购值,而无需任何额外工作。 @andre std::map 也不使用插入顺序(至少默认情况下不使用,而且要获得这样的比较器并不容易)。 我们还在使用 MSVS 2008... 看起来你想要 Boost.MultiIndex。 【参考方案1】:

为什么订单与插入订单不匹配?

这是因为 stdext::hash_map(以及来自 C++11 的独立于平台的标准库版本 std::unordered_map)不维护/保证其元素的任何合理顺序,甚至不保证插入顺序。这是因为它是一个散列容器,各个元素的位置基于它们的散列值容器的大小。因此,您将无法使用这样的容器维护数据的合理顺序。

您可以使用旧的std::map 来保证您的元素的顺序。但这也不是按插入顺序对元素进行排序,而是按比较谓词引起的顺序(可以配置为尊重插入时间,但这很不直观,也不是那么容易)。

对于其他任何事情,您都不会自己滚动(或搜索其他库,不知道 boost 是否有类似的东西)。例如,将所有元素添加到线性 std::vector/std::list 以进行插入顺序迭代,并维护一个额外的 std::(unordered_)map 指向该向量/列表,以便在必要时进行 O(1)/O(log n) 检索。

【讨论】:

感谢您的回答!这真的有助于理解事情。 @user2560991:欢迎使用 ***。如果它回答了您的问题,请务必投票并“接受”回复。

以上是关于stdext::hash_map 不清楚散列函数的主要内容,如果未能解决你的问题,请参考以下文章

gcc 中是不是有 stdext::hash_map 的等价物

使用 boost 序列化库序列化 stdext::hash_map

如果 git commit 消息以命令式编写,我该如何澄清尚未完成的工作? “不添加散列”或“没有/不添加散列”?

散列函数消息摘要与数字签名

散列的基本概念构造散列函数以及解决冲突

散列表