unordered_map
和 map
是 C++
标准库中的两种关联容器,它们有以下区别:
map
是基于红黑树实现的有序关联容器,按照键的排序顺序进行存储。而 unordered_map
是基于哈希表实现的无序关联容器,不对元素进行排序,而是根据键的哈希值将元素存储在不同的存储桶中。map
是有序的,它提供了一些有关顺序的操作,例如范围查找和顺序遍历。然而,由于 unordered_map
是无序的,它在插入、查找和删除元素的操作上通常比 map
更高效,因为哈希表提供了 map
在存储上通常比 unordered_map
更占用内存空间。而 unordered_map
则需要一定的额外空间来存储哈希函数和桶结构。map
的迭代器在插入和删除操作后仍然有效,而 unordered_map
的迭代器在插入和删除操作后可能失效。这是因为哈希表的重新散列操作可能导致存储桶的改变。map
还是 unordered_map
取决于你的具体需求。如果你需要元素有序并且需要一些与顺序相关的操作,那么 map
是一个不错的选择。如果你更关注高效的插入、查找和删除操作,并且不需要元素的顺序性,那么 unordered_map
可能更适合。unordered_map<key,value> m;
函数 | 作用 | |
---|---|---|
hash.size() | 返回当前map 容器大小(元素个数) | |
hash.empty() | 判断 map 容器是否为空,空返回1,非空返回0 | |
hash.clear() | 清空map中所有元素 | |
hash.erase(key) | 通过key删除元素 | |
hash.erase(it) | 删除迭代器it指向的元素,可与find函数结合起来使用 |
hash["cat"]=20;
</span>hash.insert({"dog",111});
①和②都可以插入,不过①可以实现更新,由于map中主键key只能有一个,不能重复,当key已经存在于map中时,使用方法①可以进行更新,而使用方法②就不会插入了。
cout<<hash["cat"];
for(auto t:hash){
cout<<t.first<<" "<<t.second<<"\n";
}
hash.find(key);
查找指定key是否存在,存在返回指向该key的迭代器,否则返回指向hash.end()的迭代器。hash.count(key);
返回key对应的元素个数,由于map容器key不允许重复,因此返回值只能为0或1,也是判断键值元素是否存在。5102:不重复的数字
7863:集合
7193:图书管理
7542-八数码问题
7860:Snowflake Snow Snowflakes