- 2.9、unordered_map
- 2.9.1、unordered_map基本概念
- 1、简介
- 1. unordered_map是无序 map 容器, C++11标准,底层是哈希表存储结构;解决冲突:链地址法
- 2. pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
- 3. 所有元素都根据元素的键值无序排序
- 2、本质:map与unordered_map的区别
- 1). map是关联式容器,unordered_map是无序容器
- 2). 关联式容器的底层实现采用的树存储结构,更确切的说是红黑树结构;
- 3). 无序容器的底层实现采用的是哈希表的存储结构。
- 4). 总的来说,实际场景中如果涉及大量遍历容器的操作,建议首选关联式容器;反之,如果更多的操作是通过键获取对应的值,则应首选无序容器。
- 3、优点:和关联式容器相比,无序容器具有以下 2 个特点
- 1). 无序容器内部存储的键值对是无序的,各键值对的存储位置取决于该键值对中的键
- 2). 和关联式容器相比,无序容器擅长通过指定键查找对应的值(平均时间复杂度为 O(1));但对于使用迭代器遍历容器中存储的元素,无序容器的执行效率则不如关联式容器。
- 4、无序容器种类
- (1) unordered_map
- 存储键值对 <key, value> 类型的元素,其中各个键值对键的值不允许重复,且该容器中存储的键值对是无序的。
- (2) unordered_multimap
- 和 unordered_map 唯一的区别在于,该容器允许存储多个键相同的键值对。
- (3) unordered_set
- 不再以键值对的形式存储数据,而是直接存储数据元素本身(当然也可以理解为,该容器存储的全部都是键 key 和值 value 相等的键值对,正因为它们相等,因此只存储 value 即可)。另外,该容器存储的元素不能重复,且容器内部存储的元素也是无序的。
- (4) unordered_multiset
- 和 unordered_set 唯一的区别在于,该容器允许存储值相同的元素。
- (1) unordered_map
- 1、简介
- 2.9.2、map构造函数
- 1、函数原型
- 1. unordered_map<T1, T2> umap; // 1.默认构造形式
- 2. unordered_map(const unordered_map& umap); //2. 拷贝构造函数
- 3. unordered_map<string, string> umap2(retUmap()); //3. 移动构造函数
- 4. unordered_map<string, string> umap2(++umap.begin(),umap.end()); // 4. 使用 unordered_map 类模板提供的迭代器,在现有 unordered_map 容器中选择部分区域内的键值对,为新建 unordered_map 容器初始化。创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。
- 2、示例
-
unordered_map<string, string> umap; // 1.默认构造形式
unordered_map<string, string> umap2(umap); //2. 拷贝构造函数
// 3. 移动构造函数
//1)返回临时 unordered_map 容器的函数
unordered_map <string, string > retUmap(){
unordered_map<string, string>tempUmap{
{"Python教程","Python基础教程,Python入门教程(非常详细)"},
{"Java教程","Java学习教程,Java基础教程(从入门到精通)"},
{"Linux教程","Linux命令大全,Linux常用命令【非常详细】"} };
return tempUmap;
}
//2)调用移动构造函数,创建 umap2 容器
unordered_map <string, string > umap2(retUmap());
unordered_map<string, string> umap2(++umap.begin(),umap.end()); // 4. 创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。
-
- 1、函数原型
- 2.9.3、map赋值和交换操作
- 1、函数原型
- 1. unordered_map& operator=(const unordered_map& mp); // 1.重载等号操作符
- 2. swap(mp); // 2. 交换两个集合容器, 交换 2 个 unordered_map 容器存储的键值对,前提是必须保证这 2 个容器的类型完全相等。
- 1、函数原型
- 2.9.4、unordered_map判空和大小
- 1、函数原型
- 1. empty(); // 判断容器是否为空
- 2. size(); // 返回容器中元素的个数
- 1、函数原型
- 2.9.5、unordered_map插入和删除
- 1、函数原型
- 1. insert(ele); //插入元素ele,无返回值
- 1. emplace(ele); //插入元素ele,无返回值,向容器中添加新键值对,效率比 insert() 方法高。
- 2. clear(); // 删除容器中所有的元素
- 3. erase(const_iterator pos); // 删除pos位置的元素,返回下一个元素的位置
- 4. erase(const_iterator start, const_iterator end); // 删除迭代器从[start,end)之间的元素,返回下一个元素的位置
- 5. erase(key); // 删除容器中值为key的元素
- 1、函数原型
- 2.9.6、unordered_map查找和统计
- 函数原型
- 1. find(key); // 查找key是否存在,返回该键的元素的迭代器;若不存在,则返回unordered_map.end();
- 2. count(key); // 统计key的元素的个数
- 函数原型
- 2.9.7、map容器无序
- 1、学习目标
- unordered_map容器默认排序规则为无序的,掌握如何改变规则
- 2、技术点
- 利用仿函数,可以改变排序规则
- 1、学习目标
- 2.9.1、unordered_map基本概念