如何在C ++中的unordered_map中插入工作?

时间:2016-12-04 07:16:00

标签: c++ c++11 stl insert unordered-map

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;
}

此代码计算给定输入中的对数并打印它。我想知道 unordered_map 插入方法是如何工作的。每当我看到一个数字时,我都会用值&#39; 0&#39;插入它。

插入方法是否跳过插入值&#39; 0&#39;当它再次看到相同的数字?它是如何工作的?

  

输入 -

     

9

     

10 20 20 10 10 30 50 10 20

     

输出 -

     

3

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

  1.   

    插入方法是否跳过插入值&#39; 0&#39;当它看到了   同样的号码?

  2. 是的,确实如此。

    来自 cpp.reference.com unordered_map

      

    无序映射是一个包含键值的关联容器   配对唯一键。搜索,插入和删除元素   具有平均的恒定时间复杂度。

    来自 cpp.reference.com unordered_map::insert

      

    如果容器没有,则将元素插入容器中   已包含具有等效键的元素。

    1.   

      它是如何运作的?

    2. 我认为某些工作原则在很大程度上取决于特定的 STL 实现。

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

答案 2 :(得分:0)

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