在C 工作中插入Unordered_map中的插入如何

How does insertion in an unordered_map in C++ work?

本文关键字:插入 map 工作中 Unordered      更新时间:2023-10-16
int main() 
{
    auto n=0, sockNumber=0, pairs=0;
    unordered_map<int, int> numberOfPairs;
    cin >> n;
    for(int i=0; i<n; ++i)
    {
        cin >> sockNumber;
        numberOfPairs.insert({sockNumber, 0}); // >>>>>> HERE <<<<<<
        numberOfPairs.at(sockNumber) += 1;
        if(numberOfPairs.at(sockNumber) % 2 == 0)
        {
            pairs += 1;
        }
    }
    cout << pairs;
    return 0;
}

此代码计算给定输入中的对数并打印。我想知道 insert unordered_map 的方法。每当我看到一个数字时,我都将其插入一个值" 0"。

插入方法再次看到相同的数字时会跳过值'0'?它是如何工作的?

输入 -

9

10 20 20 10 10 30 50 10 20

输出 -

3

  1. 插入方法跳过时插入值'0' 再次相同的数字?

是的。

来自 cpp.reference.com unordered_map:

无序地图是一个包含键值的关联容器 与对唯一键对。搜索,插入和去除元素 具有平均恒定时间复杂性。

cpp.reference.com unordered_map :: insert:

如果容器不 已经包含带有等效键的元素。

  1. 它如何工作?

我想某些工作原则在很大程度上取决于特定的 stl 实现。

基本上 unordered_map 是作为哈希表实现的,其中元素被组织到与同一哈希相对应的桶中。当您尝试插入键值 Pair hash时。如果哈希表中没有这样的哈希,或者在与计算哈希相对应的桶中没有这样的键值对,则将新对插入 unordered_map

unordered_map不允许键重复,因此,如果您尝试使用.insert()方法插入相同的密钥,则会失败并跳过该操作。但是,如果您使用unorderedmap [key] = value插入重复键,则不会跳过,而是将匹配键的值更新到新值。

std :: unordered_map保存独特的键作为值。如果要继续插入相同的密钥,请使用std :: unordered_multimap。

另外,您应该意识到std :: unordered_map :: insert返回的值表示插入是否成功。

if ( !numberOfPairs.insert({sockNumber, 0}).second )
{
   // insertion didn't work 
}

您可以使用以上内容确认未插入该项目,因为地图中已经存在相同的密钥。