《C++ Primer》--学习11

关联容器中的元素是按关键字来保存和访问的

两个主要的关联容器类型是 map 和 set。map 中的一个关键字-值(key - value)对:关键字起到索引作用,值则表示与索引相关联的数据。set 中每个元素只包含一个关键字;

以下八个容器间的不同体现在三个维度上:

(1):是一个 set 或者是一个 map

(2):要求不重复关键字或允许重复关键字,允许重复的名字以 multi 开头

(3):按顺序保存元素,或无序保存  不保持关键字按顺序存储的容器的名字以 unordered 开头

《C++ Primer》--学习11_第1张图片

使用关联容器

使用 map

《C++ Primer》--学习11_第2张图片

 使用 set

《C++ Primer》--学习11_第3张图片

 关联容器概述

关联容器的迭代器都是双向的

定义关联容器

当定义一个 map 时,必须既指明关键字类型又指明值类型。而定义一个 set 时,只需要指明关键字类型,因为 set 中没有值

每个关联容器都定义了一个默认构造函数,它创建了一个指定类型的空容器,,我们也可以将关联容器初始化为另一个通类型容器的拷贝,或是从一个值范围来初始化关联容器,只要这些值可以转化

对关联容器进行初始化:

《C++ Primer》--学习11_第4张图片

关键字类型的要求

对于有序容器---map,multimap,set 以及 multiset ,关键字类型必须元素比较的方法

默认情况下,标准库使用关键字类型的 < 运算符来比较两个关键字

在集合类型中,关键字类型就是元素类型,在映射类型中,关键字类型是元素的第一部分的类型

《C++ Primer》--学习11_第5张图片

《C++ Primer》--学习11_第6张图片

pair 类型

 pair 的数据成员是 public 的,两个成员分别命名为 first 和 second

《C++ Primer》--学习11_第7张图片

 关联容器操作

《C++ Primer》--学习11_第8张图片

《C++ Primer》--学习11_第9张图片

 关联容器迭代器

当解引用一个关联容器迭代器时,得到一个类型为容器的 value_type 的值的引用

对 map 来说,value_type 是一个pair 类型,其 first 成员保存 const 的关键字,second 成员保存值

《C++ Primer》--学习11_第10张图片

 set 的迭代器是 const 的

遍历关联容器

map 和 set 类型都支持 begin 和 end 操作,可以用这些函数获取迭代器,然后用迭代器来遍历容器

《C++ Primer》--学习11_第11张图片

添加元素

对于 map 和 set (以及对应的无序类型)包含保护不重复的关键字,因此插入一个已存在的元素对容器没有影响

 向 map 添加元素

《C++ Primer》--学习11_第12张图片

《C++ Primer》--学习11_第13张图片

 检测 insert 的返回值

《C++ Primer》--学习11_第14张图片

《C++ Primer》--学习11_第15张图片

 展开递增语句 

《C++ Primer》--学习11_第16张图片

 向 multiset 或 multimap 添加元素

《C++ Primer》--学习11_第17张图片

 删除元素

《C++ Primer》--学习11_第18张图片

 map 的下标操作

map 和 unordered_map 容器提供了下标运算符和一个对应的 at 函数

map 下标运算符接受一个索引(即一个关键字),获取与此关键字相关联的值。不同的是:如果关键字并不在 map 中,会为它创建一个元素并插入到 map 中,关联值将进行值初始化

由于下标运算符可能插入一个新元素,我们只可以对非 const 的 map 使用下标操作

《C++ Primer》--学习11_第19张图片

 使用下标操作的返回值

另一个不同之处是返回类型

通常情况下,解引用一个迭代器所返回的类型与下标运算符返回的类型是一样的。但对 map 则不然,当对一个 map 进行下标操作时,会获得一个 mapped_type 对象(每个关键字关联的类型),当解引用一个 map 迭代器时,会得到一个 value_type 对(pair

 访问元素

如果不需要计数,最好使用 find

《C++ Primer》--学习11_第20张图片

《C++ Primer》--学习11_第21张图片

在 multimap 和 multiset 中查找元素

如果一个 multimap 或 multiset 中有多个元素具有给定关键字,则这些元素在容器中会相邻存储

《C++ Primer》--学习11_第22张图片

 equal_range 函数

此函数接受一个关键字,返回一个迭代器 pair 。若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到匹配元素,则两个迭代器都指向关键字可以插入的位置

《C++ Primer》--学习11_第23张图片

无序容器

无序关联容器不是使用比较运算符来组织元素,而是使用一个 哈希函数 和关键字类型的 ==运算符  

管理桶

《C++ Primer》--学习11_第24张图片

《C++ Primer》--学习11_第25张图片

 无序容器对关键字类型的要求

我们不能直接定义关键字类型为自定义类类型的无序容器。与容器不同,不能直接使用哈希模板,而必须提供我们自己的 hash 模板版本

《C++ Primer》--学习11_第26张图片

《C++ Primer》--学习11_第27张图片

 

 

你可能感兴趣的:(C++,C++)