问题标签 [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.
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
c++ - std::hash 的函子
我想知道计算哈希的最佳方法是什么,考虑到ptime
用作键的值主要在小时和日期上有所不同(分钟和秒通常为 0)。
我已经这样做了,但我觉得它很丑陋而且很慢:
c++ - 为什么 std::hash 不专门用于 std::reference_wrapper?
我以为会是这样,但我在标准库实现(gcc-4.8.2)中找不到这个。
为什么std::hash
不是已经专门用于std::reference_wrapper
?
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
为您自己的类型提供专业化,只要它们是常规的并且相等是可传递的?
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 机器上调试了崩溃,他报告说它只在调试编译模式下通过给出“向量下标超出范围”而中断。
问:
- 发布的代码对于散列 a 是否有效
std::pair<T*, T*>
? - 有没有更健壮/更好的哈希 a 方法
std::pair<T*, T*>
? - 是什么导致了这种奇怪的行为?
PS:非常抱歉没有发布mcve,但这是不可能的。
c++ - 内部范围枚举、散列函数和 unordered_set 数据成员
我有以下问题,我找不到解决方案。当然,可能根本不存在解决方案,但我想在放弃之前尝试一下SO。
首先,一个编译没有错误的片段:
考虑到这段代码,我发现自己需要将其unordered_set
作为派生类的数据成员,S
或者至少是派生类。std
一个可能的工作解决方案是在命名空间关闭后添加以下行:
另一种可能的解决方案可能是(我没有尝试过)使用无范围的枚举。无论如何,我所做的第一次尝试是修改的定义struct S
如下:
这以错误告终,因为(如果我正确理解了问题)unordered_set
需要专门的hash
功能。无论如何,后者S::E
至少需要声明,因此交换两段代码是不够的。
这是错误日志的第一部分(因为它很长):
通常,在这种情况下,我可以使用前向声明之类的方法来解决,如下例所示:
不幸的是,我无法对嵌入在结构中的枚举做类似的事情,这就是我开始这个问题的原因。是否有可能解决它,从而避免定义派生类,或者派生是这种情况下唯一可行的解决方案?D
c++ - 具有任意数量基本类型属性的对象的 std::hash 变体
讨论:
假设我有一个struct
/class
具有任意数量的属性,我想将其用作 a 的键,std::unordered_map
例如:
我知道我必须为它定义一个哈希函子,例如:
然后将 my 定义std::unordered_map
为:
不过,困扰我的是如何为FooHasher
. 我也倾向于喜欢的一种方法是使用std::hash
. 但是,有许多变化,例如:
我还看到了以下方案:
我还看到有些人添加了黄金比例:
问题:
- 他们试图通过在结果中添加黄金配给或移位来实现什么
std::hash
。 - 对于具有任意数量的基本类型属性的对象是否有“官方方案” ?
std::hash
c++ - 为什么 std::hash似乎是身份功能
我用“g++ main.cpp -std=c++11”编译,然后结果是:
为什么会这样?我不使用任何库,也没有专门的散列函数。
附录:我想为 int 的 unordered_set 的 unordered_set 定义散列,其中集合的散列是其分量散列的总和,但如果它只是标识它并不酷,因为 {2,4} 的散列与{1,5} 的哈希值。避免这种情况的最简单方法可能是使用 std::hash 双精度函数。
c++ - 使用 std::hash 时编译错误;没有命名模板类型
我收到错误
“hashmap.hpp:63:14:错误:命名空间‘std’中的‘hash’没有命名模板类型std::hash hash;”
我不明白为什么在传入类型 T 时需要实现自己的专业化,这可能是适用于散列函数的类型之一。
哈希图.hpp
温度.cpp