现在std有一个真正的哈希映射unordered_map,为什么(或何时)我还想在它实际存在的系统上使用旧的mapover unordered_map?是否有任何我无法立即看到的明显情况?
C++ STL unordered_map如何解决冲突?
查看http://www.cplusplus.com/reference/unordered_map/unordered_map/,它显示"唯一键容器中没有两个元素可以具有等效键."
这应该意味着容器确实解决了碰撞.但是,该页面并没有告诉我它是如何做到的.我知道一些解决冲突的方法,比如使用链表和/或探测.我想知道的是c ++ STL unordered_map如何解析它.
c ++ unordered_map碰撞处理,调整大小和重新散列
这是我之前提出的一个问题,我看到我对unordered_map的实现方式感到很困惑.我相信很多其他人都会和我分享这种困惑.基于我所知道的信息而不阅读标准:
每个unordered_map实现都将链表存储到存储桶数组中的外部节点...不,这对于实现最常见用途的哈希映射来说并不是最有效的方法.不幸的是,unordered_map规范中的一个小"疏忽"都需要这种行为.所需的行为是元素的迭代器在插入或删除其他元素时必须保持有效
我希望有人可以解释实现以及它如何与c ++标准定义(在性能要求方面)相对应,以及它是否真的不是实现哈希映射数据结构的最有效方法如何改进它?
我对C++比较陌生.在Java中,我很容易实例化和使用hashmap.我想知道如何在C++中以一种简单的方式来实现它,因为我看到了很多不同的实现,但对我来说它们都不是很简单.
我正在尝试找到一种以高效的方式在C中存储"键,值"对以便快速检索数据的方法.我一直在网上看,似乎没有一种快速简便的方法来存储它们,例如Java.我需要能够经常访问和更新值,并且还能够添加新密钥并按顺序对其进行排序.我已经阅读了有关使用qsort()和bsearch()完成这些的内容,但我不确定使用什么数据结构来存储它们.
我最近发现了一件奇怪的事情.似乎计算Collatz序列长度完全没有缓存比使用缓存所有元素快 2倍.std::unordered_map
注意我确实从问题提示中是否gcc std :: unordered_map实现缓慢?如果是这样 - 为什么?我试着用这些知识来std::unordered_map表现我的能力(我使用g ++ 4.6,它确实比g ++的最新版本表现更好,我试着指定一个声音的初始桶数,我使它完全等于最大值地图必须持有的元素数量).
相比之下,使用std::vector缓存一些元素几乎比没有缓存快17倍,比使用缓慢快近40倍std::unordered_map.
我做错了什么,或者这个容器是慢的,为什么?可以让它表现得更快吗?或者,哈希映射本质上是无效的,应该尽可能避免在高性能代码中使用?
有问题的基准是:
#include <iostream>
#include <unordered_map>
#include <cstdint>
#include <ctime>
std::uint_fast16_t getCollatzLength(std::uint_fast64_t val) {
static std::unordered_map <std::uint_fast64_t, std::uint_fast16_t> cache ({{1,1}}, 2168611);
if(cache.count(val) == 0) {
if(val%2 == 0)
cache[val] = getCollatzLength(val/2) + 1;
else
cache[val] = getCollatzLength(3*val+1) + 1;
}
return cache[val];
}
int main()
{
std::clock_t tStart = std::clock();
std::uint_fast16_t largest …Run Code Online (Sandbox Code Playgroud) 我有一个超级高性能的C/C++数据结构(见这里!),我想在我的C#程序中访问和使用它.
想象中的C/C++数据结构具有一个公共API( ,,get 等).如何以高性能的方式在C#中多次调用这些方法?adddelete
PS批评我使用短语"C/C++"之前...
在我看来,C/C++与C和 C++编程语言不同.我不知道C++,而是C的扩展,它使用一些C++构造,可以用C++编译器编译!
我有一个unordered_map存储大对象:
std::unordered_map<uint64_t, LargeObject> map;
LargeObject 是一个 POD 数组/没有指针成员。
我收到了很多LargeObjects,所以我只想在它们不存在的情况下将它们插入到地图中(很多时候它们确实存在,因为我正在收听多个来源)。
性能很重要,因为我收到了数百万美元。
似乎有几种方法可以做到这一点:
map[key] = largeObject;
Run Code Online (Sandbox Code Playgroud)
或者:
map.insert(std::make_pair<uint64_t, LargeObject>(key, largeObject);
Run Code Online (Sandbox Code Playgroud)
或者:
if(map.count(key) == 0)
{
map[key] = largeObject;
}
Run Code Online (Sandbox Code Playgroud)
或者:
auto iter = map.find(key);
if(iter == map.end())
{
map[key] = largeObject;
}
Run Code Online (Sandbox Code Playgroud)
也许还有更多我没有包括在内。
当地图的值是一个大对象时,哪种插入技术最有效?