您的位置:首页 > 文旅 > 旅游 > C++ STL 之哈希 map unordered_map

C++ STL 之哈希 map unordered_map

2025/1/5 7:12:30 来源:https://blog.csdn.net/qq_44961737/article/details/141874917  浏览:    关键词:C++ STL 之哈希 map unordered_map

一. 概述

在C++中,unordered_map 是一个关联容器,是一种基于哈希表的键值对容器,它存储了键值对(key-value),其中每个键(key)都是唯一的。

二. map & unordered_map的区别

  1. map内部由红黑树实现,红黑树有自动排序的功能,因此map内部所有元素都是有序的,查找删除等为O(logN),但是红黑树里的每个节点需要保存节点信息,所以占用空间大
  2. unordered_map内部由哈希表实现,通过把键值映射到Hash表中的位置来访问记录,查找为O(1),元素的排列顺序是无序的。

三. 初始化

3.1. 头文件

#include <unordered_map>
#include <map>

3.2 声明

std::unordered_map<key_type, value_type> mp;
std::map<key_type, value_type> mp;

3.3 初始化方式

unordered_map<string,int> mp; 
unordered_map <ptr*, int> mp;

3.4 构造方式

//默认构造
unordered_map<string,int> mp;
//初始化函数列表
unordered_map<string,int> mp = {"语文",95}, {"数学",100}};
unordered_map<string,int> mp(5); // 构造并指定初始容量
//拷贝构造
unordered_map<string,int> mp2(mp1); 
//移动构造
unordered_map<string,int> mp3(move(mp1)); 

四. 常用接口

成员函数释义
emplace()插入键值对
insert()插入键值对
find(key)查找以 key 为键的键值对,若找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器
erase()删除键值对
clear()删除所有键值对
size()键值对个数
empty()判断是否为空,为空返回真,反之返回假
count(key)在容器中查找以 key 键的键值对的个数
begin()返回指向容器中第一个键值对的正向迭代器
end()返回指向容器中最后一个键值对之后位置的正向迭代器
cbegin()和 begin() 功能相同,返回的迭代器不能修改键值对
cend()和 end() 功能相同,返回的迭代器不能修改键值对
at(key)返回容器中存储的键 key 对应的值,若 key 不存在,则会抛出异常。
operator[key]重载了 [] 运算符,根据key获取键值。(如果没有该键值对,就会将其插入)

五. 遍历

1. 迭代器

#include <iostream>
#include <unordered_map>
using namespace std;int main(){unordered_map<string,int> mp = {{"语文",95}, {"数学",100},{"英语",90}};// 迭代器访问for(unordered_map<string,int>::iterator it = mp.begin(); it != mp.end(); it++){cout << it->first << " " << it->second << endl;}//autofor(auto it = mp.begin(); it != mp.end(); it++){cout << it->first << " " << it->second << endl;}return 0;
}/*
output:
英语 90
数学 100
语文 95
英语 90
数学 100
语文 95
*/

2. 值遍历

#include <iostream>
#include <unordered_map>
using namespace std;int main(){unordered_map<string,int> mp = {pair<string,int>("语文",95),pair<string,int>("数学",100),pair<string,int>("英语",90),};// 值遍历for(pair<string,int> kv:mp){cout << kv.first << " " << kv.second << endl;}//autofor(auto kv:mp){cout << kv.first << " " << kv.second << endl;}return 0;
}/*
output:
英语 90
数学 100
语文 95
英语 90
数学 100
语文 95
*/

3.引用遍历

#include <iostream>
#include <unordered_map>
using namespace std;int main(){unordered_map<string,int> mp = {pair<string,int>("语文",95),pair<string,int>("数学",100),pair<string,int>("英语",90),};// 引用遍历,要加constfor(const pair<string,int>& kv:mp){cout << kv.first << " " << kv.second << endl;}//autofor(auto& kv:mp){cout << kv.first << " " << kv.second << endl;}return 0;
}/*
output:
英语 90
数学 100
语文 95
英语 90
数学 100
语文 95
*/

参考:
https://blog.csdn.net/qq_44431690/article/details/141650549?spm=1001.2014.3001.5506
https://www.runoob.com/cplusplus/cpp-libs-unordered_map.html
https://blog.csdn.net/qq_21539375/article/details/122003559#:~:text=c++%20unorde
https://blog.csdn.net/kingxzq/article/details/133364438#:~:text=%E5%9C%A8%20C++98/03

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com