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
答案 0 :(得分:1)
std::unordered_map将唯一键作为值保存。如果要继续插入相同的密钥,请使用std::unordered_multimap。
此外,您应该意识到std::unordered_map::insert返回一个值,表示插入是否成功。
if ( !numberOfPairs.insert({sockNumber, 0}).second )
{
// insertion didn't work
}
您可以使用上述内容确认该项目未插入,因为地图中已存在相同的密钥。
答案 1 :(得分:1)
插入方法是否跳过插入值&#39; 0&#39;当它看到了 同样的号码?
是的,确实如此。
来自 cpp.reference.com unordered_map:
无序映射是一个包含键值的关联容器 配对唯一键。搜索,插入和删除元素 具有平均的恒定时间复杂度。
来自 cpp.reference.com unordered_map::insert:
如果容器没有,则将元素插入容器中 已包含具有等效键的元素。
它是如何运作的?
我认为某些工作原则在很大程度上取决于特定的 STL 实现。
基本上 unordered_map 是作为哈希表实现的,其中元素被组织到对应于相同哈希的桶中。当您尝试插入键值对键时,会计算哈希值。如果哈希表中没有这样的哈希,或者桶中没有与计算的哈希对应的键值对,那么新对将插入到 unordered_map 中。
答案 2 :(得分:0)
unordered_map不允许密钥重复,因此如果您尝试使用.insert()方法插入相同的密钥,它将失败并跳过该操作。但是,如果使用unorderedMap [key] = value来插入重复键,则不会跳过,而是将匹配键的值更新为新值。