Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ hash_映射:为什么它定义的值小于而不是等于_C++_Data Structures_Stl - Fatal编程技术网

C++ hash_映射:为什么它定义的值小于而不是等于

C++ hash_映射:为什么它定义的值小于而不是等于,c++,data-structures,stl,C++,Data Structures,Stl,C++,使用Visual Studio 2010。关于为什么用户定义的散列映射的特征实际上需要总排序的问题 我有一个简单的结构,比如说FOO,它只有一些整数。我想使用hash\u-map,这是一个键无序的哈希表,来存储FOO的结构。我只需要快速搜索它的关联值,所以这是一个正确的选择:hash\u map 但是,我需要为FOO实现我自己的哈希函数和一些比较函数。以下是取自MSDN的哈希映射的定义: template < class Key, class Type, cl

C++,使用Visual Studio 2010。关于为什么用户定义的
散列映射的特征实际上需要总排序的问题

我有一个简单的结构,比如说
FOO
,它只有一些整数。我想使用
hash\u-map
,这是一个键无序的哈希表,来存储
FOO
的结构。我只需要快速搜索它的关联值,所以这是一个正确的选择:
hash\u map

但是,我需要为
FOO
实现我自己的哈希函数和一些比较函数。以下是取自MSDN的
哈希映射的定义:

template <
   class Key, 
   class Type, 
   class Traits=hash_compare<Key, less<Key> >, 
   class Allocator=allocator<pair <const Key, Type> > 
>
class hash_map
以下是MSDN中布尔运算符()的详细说明:

template <
   class Key, 
   class Type, 
   class Traits=hash_compare<Key, less<Key> >, 
   class Allocator=allocator<pair <const Key, Type> > 
>
class hash_map
对于序列中_Key2之前且具有相同散列值(散列函数返回的值)的类型为Key的任何值_Key1,hash_comp(_Key2,_Key1)为false。函数必须对Key类型的值施加总排序

hash_compare提供的函数返回comp(_Key2,_Key1),其中comp是一个类型为Traits的存储对象,您可以在构建对象hash_comp时指定它。对于默认的Traits参数type less,排序键的值从不减少

FOO
编写
hash\u compare
类很容易。这个问题不是问如何实现一个类。然而,我不明白为什么它们的默认特征参数是
less
,并且需要总排序

hash\u-map
是一种无序的数据结构。因此,我认为用
等于
不等于
而不是
小于
大于
就足够了。然而,MSDN的描述明确指出密钥是有序的,这让我感到困惑


我是否误解了哈希映射的定义?为什么STL的
hash\u-map
实际上需要其键的顺序?

hash\u-map
的确切要求随实现的不同而不同,其中一些要求(如您所见)没有多大意义。这就是为什么他们决定在TR1和/或C++0x中包含
哈希映射(或
哈希映射*
)的部分原因。相反,它们有<代码>无序(多)(map set)<代码>,只需要<代码>均衡器键>代码>,而不是<代码>操作符>代码>代码> Hasymap Map <代码>,这是VS2003中的微软扩展,实际上是在VisualC++中的代码> STDEXT < /C>中-它不是STL的一部分。p>
std::unordered_map
是关联容器的官方版STL,可通过哈希键进行值访问-正如您所期望的那样,其谓词表示相等

template<class Key,
    class Ty,
    class Hash = std::hash<Key>,
    class Pred = std::equal_to<Key>,
    class Alloc = std::allocator<std::pair<const Key, Ty> > >
    class unordered_map;
模板
类无序图;
对于序列中_Key2之前且具有相同散列值(值)的类型为Key的任何值_Key1 由哈希函数返回),hash_comp(_Key2,_Key1)为false。该函数必须施加一个 键类型的值的总排序

具有相同散列值的键的总顺序保证了散列到相同存储桶的键的总顺序


这为在特定存储桶内更有效地执行密钥搜索提供了机会,例如,Θ(logn)二进制搜索是可能的。如果没有这样的保证排序,最坏的情况(许多不同的键都在同一个桶中,因为它们都散列到同一个值)是Θ(n)。

+1这是一堂有趣的历史课,但我认为它不能完全回答这个问题……谢谢!是的,我应该使用无序地图。我想知道hash_map over map和unordered_map有什么独特的功能。@minjang:map是有序的(通常实现为平衡树),所以它支持查找范围内的项目。无序映射提供O(1)插入/删除/查找。hash_映射与unordered_映射类似,但没有规范可遵循,因此不同的版本具有不同的功能、要求等。我不认为这种总排序对搜索有帮助。这是因为1)散列函数应该是统一的,并且当load_factor<1时,在大多数情况下,它意味着每个散列槽一个元素。i、 不需要二进制搜索。2) 显然,它会减慢插入速度。@Chang,除非您提前知道所有可能的密钥,否则无法保证每个插槽有一个元素-事实上,一种DOS攻击利用哈希函数的知识故意产生冲突。不,不明显它会减慢插入速度。