c++unordered_mapcollisionhandling,resizeandrehash这是我之前提出的一个问题,我发现我对unordered_map的实现方式有很多困惑。我相信很多其他人也和我一样困惑。根据我没有阅读标准就知道的信息:Everyunordered_mapimplementationstoresalinkedlisttoexternalnodesinthearrayofbuckets...No,thatisnotatallthemostefficientwaytoimplementahashmapformostcommonuses.Unfortunately,
最近发现C++中hashmap的实现会叫unordered_map。当我查看他们为什么不只是使用hash_map时,我发现显然hash_map的实现存在兼容性问题,即unordered_map解析(更多关于它here)。那个wiki页面没有提供更多信息,所以我想知道是否有人知道unordered_map解决的hash_map的一些问题。 最佳答案 由于C++标准库中没有定义哈希表,标准库的不同实现者会提供一个非标准的哈希表,通常命名为hash_map。因为这些实现不是按照标准编写的,所以它们在功能和性能保证方面都有细微的差别。从C+
我正在使用unordered_map和unordered_map每种情况下使用什么哈希函数,每种情况下发生冲突的可能性是多少?我将在每种情况下分别插入唯一字符串和唯一int作为键。我有兴趣了解字符串和int键的哈希函数算法及其冲突统计信息。 最佳答案 函数对象std::hash被使用了。标准特化适用于所有内置类型,以及一些其他标准库类型如std::string和std::thread.查看完整列表的链接。对于要在std::unordered_map中使用的其他类型,你必须专攻std::hash或创建自己的函数对象。冲突的可能性完全取
我有一个包含枚举类的类。classShader{public:enumclassType{Vertex=GL_VERTEX_SHADER,Geometry=GL_GEOMETRY_SHADER,Fragment=GL_FRAGMENT_SHADER};//...然后,当我在另一个类中实现以下代码时...std::unordered_mapshaders;...我得到一个编译错误。...usr/lib/c++/v1/type_traits:770:38:Implicitinstantiationofundefinedtemplate'std::__1::hash'是什么导致了这里的错误?
假设我想以字符串为键映射数据。我应该选择哪个容器,map还是unordered_map?unordered_map占用更多内存,所以我们假设内存不是问题,关注的是速度。unordered_map通常应该给出O(1)的平均复杂度,最坏的情况是O(n)。在什么情况下会达到O(n)?map什么时候比unordered_map更省时?当n小时会发生这种情况吗?假设我将使用STLunordered_map和默认的haserVs。map。字符串是关键。如果我要遍历元素而不是每次都访问单个元素,我应该更喜欢map吗? 最佳答案 |map|unor
我刚刚失去了三天的生命来追踪一个非常奇怪的错误,其中unordered_map::insert()破坏了您插入的变量。这种非常不明显的行为只发生在最近的编译器中:我发现clang3.2-3.4和GCC4.8是唯一编译器来展示这个“特性”。以下是我的主要代码库中的一些简化代码,用于演示该问题:#include#include#includeintmain(void){std::unordered_map>map;autoa(std::make_pair(5,std::make_shared(5)));std::cout我可能和大多数C++程序员一样,希望输出看起来像这样:a.second
这个问题在这里已经有了答案:Isthereanyadvantageofusingmapoverunordered_mapincaseoftrivialkeys?(15个回答)关闭4年前。既然std在unordered_map中有一个真正的HashMap,为什么(或何时)我仍想使用旧的map在实际存在的系统上通过unordered_map?是否有任何我无法立即看到的明显情况? 最佳答案 作为alreadymentioned,map允许以排序的方式遍历元素,但unordered_map不允许。这在许多情况下都非常重要,例如显示集合(例如
C++0x正在引入unordered_set,它可以在boost和许多其他地方使用。我的理解是unordered_set是具有O(1)查找复杂度的哈希表。另一方面,set只不过是一棵具有log(n)查找复杂度的树。为什么会有人使用set而不是unordered_set?即是否需要set了? 最佳答案 无序集必须通过以下几种方式为其O(1)平均访问时间付费:set比unordered_set使用更少的内存存储相同数量的元素。对于少量元素,在set中查找可能比unordered_set中的查找更快.尽管unordered_set的平均情
我正在使用来自gnu++0x的std::unordered_map来存储大量数据。我想为大量元素预先分配空间,因为我可以限制使用的总空间。我想做的是打电话:std::unordered_mapm;m.resize(pow(2,x));其中x是已知的。std::unordered_map不支持这个。如果可能,我宁愿使用std::unordered_map,因为它最终会成为标准的一部分。其他一些限制:需要可靠的O(1)访问和map变异。所需的散列和比较函数已经是非标准的并且有些昂贵。O(logn)突变(与std::map一样)太昂贵了。->昂贵的哈希和比较也使得基于摊销的增长方式过于昂贵。
我正在使用来自gnu++0x的std::unordered_map来存储大量数据。我想为大量元素预先分配空间,因为我可以限制使用的总空间。我想做的是打电话:std::unordered_mapm;m.resize(pow(2,x));其中x是已知的。std::unordered_map不支持这个。如果可能,我宁愿使用std::unordered_map,因为它最终会成为标准的一部分。其他一些限制:需要可靠的O(1)访问和map变异。所需的散列和比较函数已经是非标准的并且有些昂贵。O(logn)突变(与std::map一样)太昂贵了。->昂贵的哈希和比较也使得基于摊销的增长方式过于昂贵。