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?