问题标签 [stdhash]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
775 浏览

c++ - 应该 std::hash当 T 为 std::pair 时工作?

我使用的是这样声明的有序集:

在对我使用的方式进行了一些分析后,set,我得出结论认为 anunordered_set将是一个更明智的选择。但是当我更改std::set为时std::unordered_set,我的编译器 (g++ 4.8.1) 收到大量错误消息,抱怨

我发现它std::hash不知道如何处理 is 的类型std::pair,尽管构成 的两种类型pair都是可散列的。我认为整数对散列函数的错误包含有关 C++11 标准的相关信息,这些信息解释了事情出错的原因。(对于 g++ 为此发出的难以穿透的错误文本墙没有很好的解释。)

在我看来

哪里some_func()可以像 XOR 一样简单(或不;请参阅为什么 XOR 是组合哈希的默认方式?

标准是否有充分的理由不需要知道如何为每个可散列类型std::hash的对象构造散列值?pair

0 投票
1 回答
494 浏览

c++ - std::hash 的函子

我想知道计算哈希的最佳方法是什么,考虑到ptime用作键的值主要在小时和日期上有所不同(分钟和秒通常为 0)。

我已经这样做了,但我觉得它很丑陋而且很慢:

0 投票
1 回答
1526 浏览

c++ - 为什么 std::hash 不专门用于 std::reference_wrapper?

我以为会是这样,但我在标准库实现(gcc-4.8.2)中找不到这个。

为什么std::hash不是已经专门用于std::reference_wrapper

0 投票
1 回答
1130 浏览

c++ - 将 std::hash 专门用于模板化 Key

我试图为我自己的类型专门化哈希,一个模板键。

我是基于cppreference

我收到编译错误“C++ 标准不提供这种类型的哈希”。我想我只是做错了。编译器甚至可以支持这种模板吗?

0 投票
2 回答
260 浏览

c++ - C++11:是否有一些常规类型不应该专门化 `std::hash` 的原因?

对于常规类型,我的意思是在Elements of Programming中对 Stepanov 的定义,基本上,有相等的概念,并且作为彼此副本的对象比较相等。

所以当你有一个 Regular Type T,并且等式关系是传递的(a == b && b == c => a == c),你可以定义一个(非平凡的)散列函数,它与定义一致平等(a == b => h(a) == h(b))。总是。

但该标准不包括许多std::hash专业。例如std::complex,没有容器,容器也没有,除了vector<bool>bitset

所以我想知道这里的设计原则是什么。

或者,换种方式问:是否有理由不std::hash为您自己的类型提供专业化,只要它们是常规的并且相等是可传递的?

0 投票
1 回答
895 浏览

c++ - unordered_map::find with key std::pair of pointers with custom hash crash in VS2012

我需要一个std::unordered_map带键的 astd::pair<T*, T*>所以我“窃取”了以下代码:

从这个stackoverflow答案

它在使用 gcc 4.9.2 的 linux 机器上就像一个魅力。find()然而,在 Windows Visual Studio 2012 中,它在调用我的成员函数时崩溃unordered_map。我的一个朋友在 windows 机器上调试了崩溃,他报告说它只在调试编译模式下通过给出“向量下标超出范围”而中断。

问:

  1. 发布的代码对于散列 a 是否有效std::pair<T*, T*>
  2. 有没有更健壮/更好的哈希 a 方法std::pair<T*, T*>
  3. 是什么导致了这种奇怪的行为?

PS:非常抱歉没有发布mcve,但这是不可能的。

0 投票
2 回答
635 浏览

c++ - 内部范围枚举、散列函数和 unordered_set 数据成员

我有以下问题,我找不到解决方案。当然,可能根本不存在解决方案,但我想在放弃之前尝试一下SO。

首先,一个编译没有错误的片段:

考虑到这段代码,我发现自己需要将其unordered_set作为派生类的数据成员,S或者至少是派生类。std一个可能的工作解决方案是在命名空间关闭后添加以下行:

另一种可能的解决方案可能是(我没有尝试过)使用无范围的枚举。无论如何,我所做的第一次尝试是修改的定义struct S如下:

这以错误告终,因为(如果我正确理解了问题)unordered_set需要专门的hash功能。无论如何,后者S::E至少需要声明,因此交换两段代码是不够的。

这是错误日志的第一部分(因为它很长):

通常,在这种情况下,我可以使用前向声明之类的方法来解决,如下例所示:

不幸的是,我无法对嵌入在结构中的枚举做类似的事情,这就是我开始这个问题的原因。是否有可能解决它,从而避免定义派生类,或者派生是这种情况下唯一可行的解​​决方案?D

0 投票
2 回答
677 浏览

c++ - 具有任意数量基本类型属性的对象的 std::hash 变体

讨论:

假设我有一个struct/class具有任意数量的属性,我想将其用作 a 的键,std::unordered_map例如:

我知道我必须为它定义一个哈希函子,例如:

然后将 my 定义std::unordered_map为:

不过,困扰我的是如何为FooHasher. 我也倾向于喜欢的一种方法是使用std::hash. 但是,有许多变化,例如:

我还看到了以下方案:

我还看到有些人添加了黄金比例:

问题:

  1. 他们试图通过在结果中添加黄金配给或移位来实现什么std::hash
  2. 对于具有任意数量的基本类型属性的对象是否有“官方方案” ?std::hash
0 投票
3 回答
7443 浏览

c++ - 为什么 std::hash似乎是身份功能

我用“g++ main.cpp -std=c++11”编译,然后结果是:

为什么会这样?我不使用任何库,也没有专门的散列函数。

附录:我想为 int 的 unordered_set 的 unordered_set 定义散列,其中集合的散列是其分量散列的总和,但如果它只是标识它并不酷,因为 {2,4} 的散列与{1,5} 的哈希值。避免这种情况的最简单方法可能是使用 std::hash 双精度函数。

0 投票
1 回答
2630 浏览

c++ - 使用 std::hash 时编译错误;没有命名模板类型

我收到错误

“hashmap.hpp:63:14:错误:命名空间‘std’中的‘hash’没有命名模板类型std::hash hash;”

我不明白为什么在传入类型 T 时需要实现自己的专业化,这可能是适用于散列函数的类型之一。

哈希图.hpp

温度.cpp