《c++ primer》 第11章 关联容器 学习笔记
来源:互联网 发布:ubuntu镜像文件 编辑:程序博客网 时间:2024/06/05 04:44
11.1使用关联容器
map 关联数组:保存关键字-值对应 头文件map set 关键字既值,既只保存关键字的容器 头文件set multimap 关键字可重复出现的map 头文件map multiset 关键字可重复出现的set 头文件set 无序集合 unordered_map 用hash函数组织的map 头文件unordered_map unordered_set 用hash函数组织的set 头文件unordered_set unordered_multimap hash组织的map:关键字可重复出现 头文件unordered_map unordered_multiset hash组织的set:关键字可重复出现 头文件unordered_set
使用map
11.2关联容器概述
11.2.1定义关联容器
11.2.2关键字类型的要求
有序容器的关键字类型
使用关键字类型的比较函数
11.2.3 pair类型
pair的默认构造函数对数据成员进行值初始化。一个pair保存两个数据成员(是public的),一个是first,一个是second.
pair初始化:值初始化,列表初始化(赋值初始化和直接初始化),make_pair()
创建pair对象的函数
pair<int,int> function(int a,int b){return {a,b};//c++11return make_pair( );//c++11,构造空的pairreturn pair<int,int>(a,b);//之前版本的返回形式:显式初始化return make_pair(a,b);//}
11.3关联容器操作
key_type 此容器的关键字类型mapped_type 每个关键字关联的类型,只适用于mapvalue_type 对于set,和key_type相同(变量类型 ) 对于map,为pair<const key_type, mapped_type>
11.3.1关联容器迭代器
11.3.2添加元素
c.insert()有两个版本,分别接受一对迭代器和一对参数列表,返回一对pair,first成员是一个迭代器,指向具有给定关键字的元素,second成员是一个bool值,指出元素是成功还是失败(之间已经有这个元素了)。insert对set,map添加元素,添加重复的元素对这两个容器没有其他影响。
向map中添加元素:
c.insert((1,1));c.insert(make_pair(1,1));c.insert(pair<int,int>(1,1));c.insert(map<int,int>::value_type(1,1));c.insert(b,e);
向set中添加元素:
c.insert(il);c.insert(b,e);
向multimap或multiset中添加元素:
可以插入具有相同关键字的元素。
接受单个元素的insert操作返回一个指向新元素的迭代器。这里不需要返回一个bool值,因为insert总是向这个容器中加入一个新元素。
11.3.3删除元素
与顺序容器删除操作很相似。
c.erase(p); 返回一个迭代器,指向p之后元素的迭代器c.erase(b,e);返回ec.erase(k);k为关键字,返回删除元素的数量
11.3.4map的下标操作
map支持下标运算符和c.at()函数,下标运算符中接受一个关键字。如果关键字不在map中,会自动创建一个元素插入到map中,关联值被初始化
set不支持下标运算符
c.[k] k不在c中,就插入一个
c.at[k] k不在c中,抛出异常
下标操作返回类型是maped_type对象,是个左值。
11.3.5访问元素
c.find(k) 返回一个迭代器,指向第一个关键字的元素 c.count(k) 返回一个数字,表明有多少元素有这个关键字c.lower_bound(k) 返回一个迭代器,指向第一个关键字不小于k的元素 >=c.upper_bound(k) 返回一个迭代器,指向第一个关键字大于k的元素 >c.equal_range(k) 返回一个关键字pair,表示关键字等于k的元素范围
11.4无序容器
unordered_map 用hash函数组织的map 头文件unordered_map unordered_set 用hash函数组织的set 头文件unordered_set unordered_multimap hash组织的map:关键字可重复出现 头文件unordered_map unordered_multiset hash组织的set:关键字可重复出现 头文件unordered_set
这些容器不是使用比较运算符来组织元素的,而是使用一个哈希函数和关键字类型的==运算符。
无序容器提供了和有序容器相同的操作(初始化,赋值,添加insert,删除erase,下标操作,访问find、count)。也有允许关键字重复的版本。
但是无序容器的输出和有序容器的输出不同,因为是无序的。无序容器在存储上组织为一组桶,每个桶保存零个或者多个元素。无序容器使用一个哈希函数将元素映射到桶。为了访问一个元素,容器首先计算元素的哈希值,它指出应该搜索哪个桶。如果容器允许重复关键字,所有具有相同关键字的元素也都会在同一个桶中。因此无序容器的质量依赖于hash函数的质量和桶的大小和数量。
分别是g++和vs调试的结果,可以发现结果并不相同。
无序容器对关键字类型的要求
默认情况下,无序容器使用关键字==来比较元素,它们还使用了一个hash<key_type>类型的对象来生成每个元素的hash值。
但是我们不能定义关键字类型为自定义类类型的无序容器。与容器不同,不能直接使用hash模板,而是必须提供我们自己的hash模板
但是有另外一种方法:为了将自己的类当作关键字,我们要自己提供==运算符和hash值计算函数。
然后定义。
如:
using SD_multiset = unordered_multiset<Sales_datam decltype(hasher)*, decltype(eqop)*>; //hasher是自己定义的hash函数,eqop是自己定义的==运算符。 SD_multiset bookstroe(43, hasher, eqop);//初始化
- 【C++primer学习笔记】第10章 关联容器
- 《c++ primer》 第11章 关联容器 学习笔记
- 《c++ primer》 第11章 关联容器 学习笔记
- C++ Primer 第11章 关联容器 第一次学习笔记
- c++ primer学习笔记 第 10 章 关联容器
- C++Primer学习笔记第十章(10/18)关联容器
- 《C++Primer》读书笔记——第11章 关联容器
- C++ Primer学习总结 第11章 关联容器
- 【C++primer学习笔记】第9章 顺序容器
- C++Primer学习笔记(10)关联容器
- c++primer阅读笔记之关联容器学习
- C++ primer第二次阅读学习笔记(第10章:关联容器)
- C++Primer第10章关联容器习题
- C++primer第4版第十章关联容器
- C++primer第五版笔记-第十一章关联容器
- c++Primer笔记(十 关联容器)
- C++Primer第五版 第11章 关联容器(练习解答)
- 重新学习《C++Primer5》第11章-关联容器
- poj 2181 DP
- java中的线程
- 初级前端工程师基本技术掌握
- Spring配置文件的详解之AOP
- javaBean&&JSP
- 《c++ primer》 第11章 关联容器 学习笔记
- Windows Server2012配置VPN服务器
- C语言宏定义中#和##运算符
- 逻辑运算命令
- JS睡眠函数
- sql server 无法打开用户默认数据库。登录失败---解决办法
- dribbble ? [展示和发现设计, 全球设计师资源网站] [Dribbble is show and tell for designers.]
- BFS和DFS详解以及java实现
- vue生命周期