std::unordered_map 如何表现? [C++]

Posted

技术标签:

【中文标题】std::unordered_map 如何表现? [C++]【英文标题】:How std::unordered_map Behaves? [C++] 【发布时间】:2022-01-08 16:48:45 【问题描述】:

我正在阅读有关 C++ unordered_map 的内容,并且有一些我无法清楚回答的问题。

我注意到 unordered_map 为每个索引放置一个元素而不是多个(可以使用其中一种方法来实现哈希表,以解决映射到同一索引的 2 个元素)

    如果地图中有一个键为 A 的元素,我插入另一个元素,它会覆盖前一个元素,对吗? (无论值是否匹配)。

    是否有一个选项可以更改 unordered_map 的行为,以便它可以像我上面解释的那样在每个索引中包含多个元素?

    我从我的代码中注意到,unordered_map 每次插入一个新元素时都会变大,但这真的很糟糕,我在哈希表中了解到,每次需要它时,我们都需要将大小乘以 2,因此插入的复杂性是O(1) 摊销而不是 O(n)。

    我怎样才能给我的 unordered_map 一个初始大小但没有元素?即我知道它会达到 1000 的大小,所以我们可以直接做,而不是让它变大多次并进行大量复制。

【问题讨论】:

2:检查 std::multimap。 3. 你是否混淆了桶数和元素数? 4. 你检查过文件吗? reserve 成员函数就是这样做的。 @Passerby for 3 我用了size,我怎么知道你说的每一个的个数? 您需要的一切都在en.cppreference.com/w/cpp/container/unordered_map。对于您的第一个问题,您可以查找insert。对于您的第三个,您可以查看bucket_count 【参考方案1】:

让我简短地回答你的问题

    不,您不能插入新密钥。该功能将失败。键必须是唯一的。 不,没有选项。如果要存储多个相同的密钥,则需要使用 std::unordered_multimap 代替 您将存储桶与数字元素混为一谈。当然,如果您输入新的密钥,地图将会增长。如果 2 个不同的键有相同的哈希值,那么它们将存储在哈希值的存储桶中。 这没有多大意义。参见 3。而且,逻辑上也是:映射包含键。如果有键,则无法覆盖。但是,您可以使用它的reserve 函数来分配内部空间。 . .

所有这些都在 CPP 参考中进行了解释。请看here

【讨论】:

以上是关于std::unordered_map 如何表现? [C++]的主要内容,如果未能解决你的问题,请参考以下文章

如何同时填充 std::unordered_map ?

如何以线程安全的方式使用`std::unordered_map`?

如何在删除元素时防止重新散列 std::unordered_map?

CDT 索引器找不到 std::unordered_map

如何将 std::unordered_map 部分专门化为我的模板类的成员?

如何使用变体作为 unordered_map 中的键?