相关疑难解决方法(0)

在std :: map和std :: unordered_map之间进行选择

现在std有一个真正的哈希映射unordered_map,为什么(或何时)我还想在它实际存在的系统上使用旧的mapover unordered_map?是否有任何我无法立即看到的明显情况?

c++ hash unordered-map map c++11

130
推荐指数
5
解决办法
9万
查看次数

C++ STL unordered_map如何解决冲突?

C++ STL unordered_map如何解决冲突?

查看http://www.cplusplus.com/reference/unordered_map/unordered_map/,它显示"唯一键容器中没有两个元素可以具有等效键."

这应该意味着容器确实解决了碰撞.但是,该页面并没有告诉我它是如何做到的.我知道一些解决冲突的方法,比如使用链表和/或探测.我想知道的是c ++ STL unordered_map如何解析它.

c++ stl unordered-map

51
推荐指数
2
解决办法
2万
查看次数

如何实现std :: unordered_map

c ++ unordered_map碰撞处理,调整大小和重新散列

这是我之前提出的一个问题,我看到我对unordered_map的实现方式感到很困惑.我相信很多其他人都会和我分享这种困惑.基于我所知道的信息而不阅读标准:

每个unordered_map实现都将链表存储到存储桶数组中的外部节点...不,这对于实现最常见用途的哈希映射来说并不是最有效的方法.不幸的是,unordered_map规范中的一个小"疏忽"都需要这种行为.所需的行为是元素的迭代器在插入或删除其他元素时必须保持有效

我希望有人可以解释实现以及它如何与c ++标准定义(在性能要求方面)相对应,以及它是否真的不是实现哈希映射数据结构的最有效方法如何改进它?

c++ unordered-map hashmap c++11

48
推荐指数
1
解决办法
3万
查看次数

C++中的简单hashmap实现

我对C++比较陌生.在Java中,我很容易实例化和使用hashmap.我想知道如何在C++中以一种简单的方式来实现它,因为我看到了很多不同的实现,但对我来说它们都不是很简单.

c++ hashtable hashmap

30
推荐指数
3
解决办法
9万
查看次数

在普通C中存储键值对

我正在尝试找到一种以高效的方式在C中存储"键,值"对以便快速检索数据的方法.我一直在网上看,似乎没有一种快速简便的方法来存储它们,例如Java.我需要能够经常访问和更新值,并且还能够添加新密钥并按顺序对其进行排序.我已经阅读了有关使用qsort()bsearch()完成这些的内容,但我不确定使用什么数据结构来存储它们.

c dictionary

5
推荐指数
1
解决办法
6232
查看次数

为什么std :: unordered_map变慢,我可以更有效地使用它来缓解这种情况吗?

我最近发现了一件奇怪的事情.似乎计算Collat​​z序列长度完全没有缓存使用缓存所有元素 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++ performance caching unordered-map c++11

5
推荐指数
1
解决办法
5197
查看次数

在C#程序中使用C/C++数据结构

我有一个超级高性能的C/C++数据结构(见这里!),我想在我的C#程序中访问和使用它.

想象中的C/C++数据结构具有一个公共API( ,,get 等).如何以高性能的方式在C#中多次调用这些方法?adddelete

PS批评我使用短语"C/C++"之前...
在我看来,C/C++与C C++编程语言不同.我不知道C++,而是C的扩展,它使用一些C++构造,可以用C++编译器编译!

c c# c++ dll interop

2
推荐指数
1
解决办法
432
查看次数

C++ std::unordered_map 仅在新元素不存在时插入新元素的最快方法

我有一个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)

也许还有更多我没有包括在内。

当地图的值是一个大对象时,哪种插入技术最有效?

c++ performance c++20

2
推荐指数
1
解决办法
148
查看次数

标签 统计

c++ ×7

unordered-map ×4

c++11 ×3

c ×2

hashmap ×2

performance ×2

c# ×1

c++20 ×1

caching ×1

dictionary ×1

dll ×1

hash ×1

hashtable ×1

interop ×1

map ×1

stl ×1