问题标签 [unordered-multimap]

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 投票
1 回答
46 浏览

stl - 在 STL C++ 中查找无序多图的函数?

find 函数只返回一个指向多图中重复元素的指针。我们如何返回指向 multimap 中其他重复元素的指针。

0 投票
0 回答
32 浏览

c++11 - 为什么c++11 unordered_multimap中有这么多桶?

我有一个 unordered_multimap 并且我多次插入具有相同键的元素,因此其中一些应该放在同一个桶中。我正好插入 10000 个元素。但是由于某种原因,当我打印 bucket_count() 时它是 12983。这对我来说毫无意义,除非有一个小的 max_load_factor,但我打印了它,它似乎默认设置为 1.0,而 load_factor 约为 0.7 -0.8 插入所有内容后。有谁知道它为什么会这样工作?这不是低效吗?我可以拥有比我插入的元素数量更少的桶。

编辑:几乎忘了提及,我将哈希表的大小初始化为 n/16,其中 n 是元素的数量(在这种情况下为 10000/16=625)。所以这应该保持不变吧?但它没有。我该如何改变它。

0 投票
1 回答
81 浏览

c++ - 对 unordered_multimap 键进行平均的更好方法是什么?

我正在我的unordered_multimap中搜索获取一个键的所有值,它实际上是堆叠一个 int 和一个表示执行时间的值(以纳秒为单位)。我需要获取所有值以用一个键替换多键,平均

我尝试了一些代码,这实际上是最有价值的:

我得到的错误error: 'average' is not captured : average = average + x.second;

0 投票
1 回答
443 浏览

c++ - 在 unordered_multimap 中准确地迭代每个键一次的有效方法

我有一个std::unordered_multimap并且我想对每个键只迭代一次。

我目前正在做的是将所有密钥复制到std::set. 这对我来说似乎效率很低,我想知道是否有更聪明的方法来做到这一点。如果是 astd::multiset我会使用该std::multiset::upper_bound()成员来访问下一个键,但是该成员显然在无序版本中不可用。

我发现了一些相关的问题和答案,但就我的目的而言,它们似乎已经过时/过于复杂。

那么有没有一种遍历不同键的好方法呢?我仍在学习,因此将我指向正确的方向也将不胜感激!谢谢。

0 投票
1 回答
723 浏览

c++ - 在 MacOS 上的 unordered_multimap 中为自定义类型定义哈希函数时遇到问题

所以我想使用自定义类型(此处SWrapper为 )作为unordered_multimap. 我已经定义了一个散列类,它派生自字符串的标准散列函数,并将散列类包含在多映射的类型中。下面显示了一些重现错误的代码。这在带有 g++ 和 clang++ 的 Arch Linux 上编译,但是在带有 clang++ 的 MacOS 上,我得到了错误:

g++ -std=c++11 -Wall -Wpedantic -Wextra hash_map_test.cpp -o hash_map_test在 Arch Linux(或)上运行clang++编译代码没有错误。但是,在 MacOS 上,使用相同的命令,我收到以下错误消息:

我试过解释错误信息,但我真的不知道该怎么做。如果有人对这里发生的事情以及如何在 MacOS 上解决此问题有任何建议,我们将不胜感激!

0 投票
0 回答
29 浏览

c++ - 是否可以在 c++11 的整个 unordered_multimap 中将所有键值作为对交换?

我有一个以对作为键的 unordered_multimap。我想在整个地图中交换成对的值。示例:{pair<1,2>, 3} -> {pair<2,1>, 3}

我想遍历容器并更改所有键。可能会出现重复,这就是使用多图的原因。这在 c++11 中可行吗?

0 投票
1 回答
102 浏览

c++ - `unordered_map`中的高效节点提取()+插入()

使用 C++17 节点extract()函数,我可以更改密钥而无需重新分配节点。在我的特定用例中,我将密钥替换为相等的密钥,因此我想使用 insert()-with-hint 来避免完整的第二次查找,并且在使用时效果很好std::map

当我insert()是一个新节点时,它key_type会继续指向,但是,它会作为emplacementfrom.data()中的构造的一部分而被移出。mapped_type由于 SSO(小字符串优化),移动的字符串data()可能与源字符串的 不同,一旦的生命周期结束,可能会更快地data()使 无效。因此,我们需要将 to 重新设置为,为此我们 (1) 提取节点,确保通过在 之前递增它来保持有效,然后 (2) 根据需要修补密钥,最后 (3) 重新- 在提示给出的旧位置插入节点。key_typefromkey_typemapped_typeitextract()it

到目前为止,一切都很好。现在尝试相同的unordered_map

在这里,我遇到了一个问题unordered_map,作为 a vector<forward_list>,只有前向迭代器,所以我不能,因为我不得不,向后记住迭代顺序中最终 insert-with-hint (3) 的确切插入点。看来我只有两个选择:

  1. 在没有提示的情况下使用 insert(node),导致完整的第二次查找
  2. 递增迭代器并将其作为提示传递。标准表示插入是尽可能接近提示执行的,但至少使用桶内迭代器是仅向前的,如果我的哈希表与良好性能所需的一样稀疏,则递增的迭代器可能是桶列表中的几个桶,使提示无用。

所以,好吧,提示对unordered_map</rubberducking> 没用。为了保存问题,让我们谈谈unordered_multimap,然后:)

unordered_map中,提示可能很有用,因为与 不同unordered_mapunordered_multimap需要扫描存储桶以将新节点放入equal_range()密钥的潜在位置。有没有比后增量或根本不产生提示更好的方法?

0 投票
2 回答
60 浏览

c++ - 有没有办法将 local_iterator 转换为 const_iterator 或迭代器?

我们如何将 unordered_multimap::local_iterator 更改为 unordered_multimap::iterator 或 unordered_multimap::const_iterator?我需要更改,因为我们无法使用 local_iterator 擦除元素,而擦除只能使用 iterator/const_iterator 来完成。如果有任何其他使用 local_iterator 擦除的方式,请提出建议。