问题标签 [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 回答
253 浏览

c++ - 保证 std::unordered_multimap 中的键唯一性

std::unordered_multimap在处理迭代时,我想知道一个关键对象的唯一性。

我将尝试解释这一点:我需要将一些数据与映射中的键类型相关联,这些数据不应考虑在HashorKeyEqual元素中,但我需要它以避免与它存储单独的映射(出于优化目的) .

所以与我的想法相关的代码如下:

问题源于这样一个事实,尽管这工作正常,但不能保证作为std::pair<const Key, Foo>映射到单个元素的第一个元素检索到的键始终相同。作为其中的一个pairconst Key听起来地图中的每个元素都有其键值的副本,所以如果我这样做

false证实了我的想法。因此,如果您有多个具有相同键的值(这是您想要的,因为您使用的是 ),那么确实会浪费大量空间来存储键std::unordered_map

我没有看到任何其他解决方案,而不是类似

这允许我将属性与键配对,但由于它需要使用两个级别的迭代器,所以一切都变得不那么干净了。

还有其他我没有看到的解决方案吗?

0 投票
1 回答
1187 浏览

c++ - unordered_multimap 中具有重复键的项目是否应按插入顺序保留?

一本书提到std::unordered_multimap

元素的顺序是未定义的。唯一的保证是由于使用了多重集而可能出现的重复项按照它们的插入顺序分组在一起。

但是从下面示例的输出中,我们可以看到打印顺序与它们的插入相反。

编译和运行时会产生此输出(g++ 5.4.0):

更新: unordered_multiset 有同样的问题:

输出:

0 投票
2 回答
1009 浏览

c++ - 通过 local_it 遍历存储桶时 unordered_multimap 中的碰撞

在下面的代码中,我有一些字符串(DNA 序列)存储在一个向量中。我有一个struct,read_tag用来识别每个字符串;read_tag.read_id是字符串标识符。我取每个字符串的 30 个字符子字符串,并将其用作 an 中的键, unordered_multimap并将 theread_tag用作值;目的是对共享 30 个字符序列的字符串进行分组。自然地,相同的字符串将散列到相同的值,并最终在多映射中的同一个桶中。偏移量用于给出从 30 个字符标签的索引零开始的“移位”。

但是,当我运行此代码时,会遍历每个存储桶;我发现同一个桶中有多个不同的序列。我认为冲突已解决unordered_mutlimap,因此在存储桶中,它们应该只是一个键(字符串)。我知道可能会发生碰撞,但我认为链接、探测等都是在unordered_mutlimap. 您应该能够运行并检查输出以查看我在哪里感到困惑。

我也是std::hash每个键,一个桶中的一个,我发现“冲突”中的键具有不同的哈希值。

因此,就好像发生了冲突,导致值具有差异。同一桶中的密钥,但相反,密钥散列到不同的 val。他们是避免这种情况的一种方法,并根据桶中的键区分值吗?还是我需要执行此操作?

0 投票
1 回答
1034 浏览

c++ - 错误:对于 unordered_multimap,static_assert 失败“此哈希仅适用于枚举类型”

我正在尝试插入

像这样:

但是,编译器在编译时继续向我打招呼,出现以下错误:

现在,经过一些 Google-fu 并在此处阅读有关此错误的其他问题(thisthis),仅使用 unordered_map 代替,我得出的结论是我需要提供自己的哈希函数。但是,这让我感到困惑,因为我读过的其他问题似乎涉及自定义(用户定义)类的键,我不认为我使用的键类型是“自定义”。如果有人可以对此提供见解,我将不胜感激!

0 投票
1 回答
1258 浏览

c++ - 在 boost::unordered_multimap 中循环遍历 equal_range

我正在尝试学习如何遍历从具有相同键的 boost::unordered_multimap 返回的值。所以,我这样做了,

boost::unordered_multimap<string, string> sample;

我可能在其中,

我尝试获取与“两个”相对应的值,所以我这样做了,

我像这样迭代它,

我会得到值:2,因为这是唯一映射的值?我会第一次跳出循环吗?我正在尝试在线/在 boost 文档中获得答案,但我没有成功。这可能是一个基本问题,但我正在努力学习。任何帮助,将不胜感激。

TIA

-R

0 投票
1 回答
765 浏览

c++ - STL 无序容器的本地迭代器有哪些用途?

在C++ 标准表 91的§23.2.7 无序关联容器 [unord.req]中,描述了 STL 无序关联容器必须满足的附加要求。在此表中,标准规定 STL 无序容器(即 、和)必须提供成员类型和。unordered_setunordered_mapunordered_multisetunordered_multimaplocal_iteratorconst_local_iterator

在此处输入图像描述

  • local_iterator 是一个迭代器类型,其类别、值、差异、指针和引用类型与无序容器的iterator. 此迭代器可用于遍历单个存储桶,但不能跨存储桶。
  • const_local_iterator是一个迭代器类型,其类别、值、差异、指针和引用类型与无序容器的const_iterator. 此迭代器可用于遍历单个存储桶,但不能跨存储桶。

这些迭代器有什么用途?

0 投票
1 回答
1040 浏览

c++ - 在 C++ 中的 std::unordered_multimap 中打印特定键的多个值

我试图在 C++ 中打印与 unordered_multiset 中的特定键关联的所有值,但不幸的是,当我运行下面的代码时,我在 Visual Studio 和在线编译器http://cpp.sh/中得到两个不同的输出。Visual Studio 仅提供“红色”作为输出 cpp.sh 仅提供“绿色”作为输出

我期望为关键的“苹果”打印“红色”和“绿色”,但我分别在 cpp.sh 和 Visual Studio 中得到绿色或红色作为输出

0 投票
2 回答
54 浏览

c++17 - 将多种类型存储到类成员容器中

我在这里阅读此 Q/A ,由于我的问题相似但不同,我想知道如何执行以下操作:

假设我有一个基本的非模板非继承类,称为Storage.

我希望这个类有一个容器(无序的多图)是我倾向于的地方......它将std::string为变量类型 T 保存一个名称 id。该类本身不会是模板。但是,添加元素的成员函数将是。要添加的成员函数可能如下所示:

然后,此函数将填充无序多图。但是,每次调用此函数时,每种类型都可能不同。所以我的地图看起来像:

如果类本身不是模板,我将如何使用模板、可变参数,甚至可能是元组、任何或变体来声明这样一个无序的多重映射?我不喜欢使用标准以外的 boost 或其他库。

我试过这样的事情:

但我似乎无法让 typedef 正确,因此我可以像这样声明它们:

0 投票
2 回答
133 浏览

c++ - 使用 std::generate 的随机 unordered_multimap

我正在尝试unordered_multimap使用以下代码生成大小为 10 的随机数:

但它不会编译错误

unordered_multimap:是否可以使用随机生成std::generate?如果没有,最好的方法是什么?

PS:我知道我应该使用std::default_random_engine而不是std::rand,并且我在真实代码中这样做,这只是为了演示目的。

0 投票
1 回答
217 浏览

c++ - 如何拥有 unordered_multimaps 的 unordered_multimap

我正在通过 unordered_multimaps 进行练习,遇到了一个问题,即 unordered_multimap 包含另一个 unordered_multimap。编译器抛出一个错误,说 c++ 标准不提供这种类型的哈希。我想我必须编写一个哈希函数,但我的理解是有限的,因为我是 STL 的新手。

我已经尝试过将结构或另一个多映射插入到 unordered_multimap 但到目前为止没有运气。

我应该如何实现这一点。我在这里想要实现的是一个人的姓名与他的生日和他去世的日期相关联。我希望将日期放在一张地图中并将其与名称映射到 m_Map2。