问题标签 [unordered-map]

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.

0 投票
2 回答
1879 浏览

gcc - gcc 支持 boost::unordered_map

何时将 unoreded_map 支持添加到 gcc?

我正在使用 RHEL 5.3 附带的 gcc 4.1.1。看起来 unoreded_map 丢失了。有没有办法手动添加?

0 投票
2 回答
2846 浏览

performance - 使用 boost 无序映射

伙计们,我正在使用动态编程方法来解决问题。以下是该方法的简要概述

  1. 生成的每个值都使用 25 个唯一键标识。
  2. 我使用boost::hash_combine使用这 25 个键为哈希表生成种子。
  3. 我将值存储在声明为的哈希表中

    boost::unordered_map<Key_Object, Data_Object, HashFunction> hashState;

  4. 我对我的算法进行了时间分析,发现将近95%的运行时间都花在了将数据检索/插入到哈希表中。

  5. 这些是我的哈希表的详细信息

    hashState.size() 1880

    hashState.load_factor() 0.610588

    hashState.bucket_count() 3079

    hashState.max_size() 805306456

    hashState.max_load_factor() 1

    hashState.max_bucket_count() 805306457

我有以下两个问题

  1. 我可以做些什么来提高哈希表的插入/检索操作的性能?

  2. C++ STL 有 hash_multimap 也符合我的要求。在插入/检索性能方面, boost 库unordered_maphash_multimap相比如何。

0 投票
4 回答
1925 浏览

c++ - 如何使用 boost::thread::id 作为 unordered_map 的键?

根据文档,对于每个正在运行的线程, aboost::thread::id可以被认为是唯一的,并且可以在容器中使用,例如std::setand std::map(因为<运算符被覆盖thread::id)。

我的问题是我想thread::id用作 a 的密钥boost::unordered_map,但是它要求密钥是“可散列的”(即支持散列到 a size_t)。由于 thread::id 的所有实现细节都是隐藏的,我认为没有什么可以使用的。

所以我的问题是 -是否可以使用 thread::id 作为 unordered_map 的键?

0 投票
5 回答
6699 浏览

c++ - unordered_map 真的是无序的吗?

我对“unordered_map”这个名字感到非常困惑。顾名思义,键根本没有排序。但我一直认为它们是按哈希值排序的。还是那是错误的(因为名称暗示它们没有被订购)?

或者换一种说法:这是

一样

? (好吧,不完全是,STL 会在这里抱怨,因为可能有键 k1,k2 并且既不是 k1 < k2 也不是 k2 < k1。您需要使用multimap并覆盖相等检查。)

或者再次不同:当我遍历它们时,我可以假设键列表是按它们的哈希值排序的吗?

0 投票
5 回答
1490 浏览

c++ - unordered_map 在 VS10 中抛出 bad_alloc 但在 VS9 中没有,这是一个错误吗?

写一篇关于欧拉项目第 14 个问题的帖子时,我遇到了 VC9 和 VC10 之间的行为差​​异。

以下代码在 VC9 中运行正常,但在 VC10 中std::unordered_map抛出bad_alloc异常。奇怪的是,如果我从异常中恢复,未来的分配将成功(容器的大小继续增长)。此外,如果我使用boost::unordered_map它在两个编译器中都可以正常工作。

关于实际内存使用情况,我在一台 4GB RAM 的机器上运行,(正在使用 1.7)VC9 版本在完成任务之前获得了约 810MB 的内存,而 VC10 则在约 658MB 时崩溃。

这是VC10中的错误吗?我在同一台机器上运行,当完成的工作量相同时,还有什么可能导致内存在一个版本中持续耗尽,而不是在另一个版本中?

<edit>
更多信息:第一次发生异常是在计算堆栈深度为 1 的 7,718,688 时(没有递归只是 main->length)。之后,添加到缓存中的每个数字似乎都会发生这种情况。在异常发生之前,缓存中有 16,777,217 个元素(根据cache.size())。有趣的是,即使insert失败,缓存大小也会增加 1,因此它似乎不提供强异常保证(违反 §23.2.1.11)。
</编辑>

代码如下:

<edit>
任何人都可以重现这种行为,有一次它消失了(然后又重新出现了),所以我的配置可能有一些特别之处。
</编辑>

0 投票
3 回答
2776 浏览

c++ - 使用 std::map/boost::unordered_map 帮助理解段错误

我有一些代码来使用模板静态类处理资源(图像、字体、网格数据等)管理,允许客户端代码执行以下操作:

“资源类型”必须有一个构造函数采用const std::string&.

getResource实现如下:

table_t定义为typedef typename boost::unordered_map< std::string, boost::shared_ptr<ResourceType> > table_t;

_resources是类型table_t

问题是boost::unordered_map我在调用find(源自find_iterator)时遇到了段错误。但是,std::map相反,我在插入操作(源自_Rb_tree_decrement)或调用find(源自string::compare)时遇到段错误。

该问题仅在第二次请求资源时发生(发生故障时文件名有效)。

由于两者都发生了这种情况,mapunordered_map假设我必须在某个地方做一些奇怪的事情来导致这种情况,有什么想法吗?

谢谢。

编辑:仍然有问题,我错了,它只发生在第二次请求资源时。但是,获取资源的前 2 次调用是成功的,这是导致段错误的第 3 次调用(每次调用都针对不同的资源)。

这是一个堆栈跟踪:

0 投票
1 回答
1080 浏览

c++ - 使用 string* 作为 unordered_set 中的键

我想将使用字符串 * 作为 unordered_list 中的键。我不想要指针本身的哈希值,而是它指向的字符串。

我知道我需要创建一个这样的结构:

并将其作为哈希器发送到地图模板,但我不确定如何。

0 投票
2 回答
5053 浏览

c++ - C++11 是否为 std::type_info 提供散列函数?

我仍在为我的One-Of-A-Type 容器问题寻找一个很好的解决方案——经过反思,我认为能够使用类似std::map<std::type_info, boost::any>. 不幸的是,std::type_info没有定义一个operator<,我认为定义一个是不合理的。

但是,为它定义一个散列函数似乎是合理的,因为您可以简单地将std::type_info对象的单例地址用作合理的“散列”。因此,您可以将 astd::type_info放入 astd::unordered_map作为键。

C++11 是否提供了这样的哈希函数?使用单例的内存地址会std::type_info是一个糟糕的哈希策略吗?

0 投票
6 回答
18066 浏览

c++ - 构建以元组为键的无序映射

在带有 Boost 的 C++ 程序中,我正在尝试构建一个无序映射,其键是双精度元组:

初始化地图可以完成,但是,当我尝试用键和值填充它时

我遇到以下错误消息:

我认为这是因为我需要为元组键指定哈希函数。我怎样才能做到这一点?

编辑:

根据以下建议,我编写了以下实现:

可以缩短吗?

0 投票
4 回答
12347 浏览

c++ - 多键哈希表(unordered_map)

我需要使用多个键(int 类型)来存储和检索哈希表中的单个值。我会使用多个键来索引单个项目。我需要快速插入并查找哈希表。顺便说一句,我不允许在实现中使用 Boost 库。

我怎么能那样做?