class Solution {
public:
vector singleNumber(vector& nums) {
unordered_map freq;
for (int num: nums) {
++freq[num];
}
vector ans;
for (const auto& [num, occ]: freq) {
if (occ == 1) {
ans.push_back(num);
}
}
return ans;
}
};
以上是官方使用unordered_map的效率
class Solution {
public:
vector singleNumber(vector& nums) {
vectorans;
maprecord;
for(auto n:nums){
int x=record[n]++;
if(x)record.erase(record.find(n));
}
for(auto x:record)ans.push_back(x.first);
return ans;
}
};
以上是自己使用map的效率
C++的STL库实现有两种字典结构,即map和unordered_map(也就是通俗意义上的hash map)。这两者虽然都称为Map,但其实它们的底层实现原理具有很大差距,因此它们的使用场景也不尽相同。
今天特意研究了一下,下面从几个方面具体谈谈它们的差别及其具体的使用场景。
字典类型又被称为关联数组(associative array),关联数组和正常数组的使用方法是相似的,但其不同之处在于字典结构的下标不必是整数,而可以是任意类型。
map和unordered_map这两种字典结构都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。但是字典中的key只能存在一个,即必须唯一(如果不唯一,则被称为multimap)。上述这点保证了值(value)可以直接通过键(key)来访问,这便是字典结构最为便捷之处。
使用方法是最直观的区别,这两种结构虽然都在STL库中,但是所使用的头文件不同。
数据结构其实是两种类型最为根本的区别,其他的不同都是这种区别产生的结果。
在2中已经解释过了,现在单独列出该点不同之处。
这点也已经在2中已经解释过了,现在单独列出该点不同。
这点实际上也是由底层的数据结构决定的。
map和unordered_map并无好坏之分,它们都有各自应用的场景。它们之间的区别归根结底来源于使用的数据结构不同。
最后一句话,总结一下它们的适用场景:
在需要元素有序性或者对单次查询性能要求较为敏感时,请使用map,其余情况下应使用unordered_map。
因此在需要使用字典结构进行算法编程的大部分情况下,都需要使用unordered_map
而不是map
。
c++ std中set与unordered_set区别和map与unordered_map区别类似:
set 基于红黑树实现,红黑树具有自动排序的功能,因此 map 内部所有的数据,在任何时候,都是有序的。
unordered_set 基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存,无自动排序功能。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用 hash 函数对 key 进行映射到不同区域进行保存。