您的位置:首页 > 编程语言 > C语言/C++

C++primer 第十一章笔记 初稿

2017-04-09 00:05 239 查看

11.1 使用关联容器

分类

有序容器

map

set

multimap

multiset

无序容器

unordered_map

unordered_set

unordered_multimap

unordered_multiset

注:set只储存key,map储存key/value,有multi前缀的key可重复。

map的基本使用

经常使用下标运算符访问map中的值,下标为键。当map中并未存在对应键时,则下标运算符会创建一个新元素,其键为下标值,并为其初始化。

set的基本操作

经常使用find函数来确认是否存在对应键。

11.2 关联容器概述

顺序容器中的很多操作,包括位置操作、插入操作等,对关联容器没有意义,因此也不被关联容器支持。

初始化关联容器方式与顺序容器类似,既可以列表初始化,也可以拷

注:对非multi前缀的关联容器,初始化时会自动过滤重复键(键值对)

关键字必须严格弱序,在定义关联容器时,可以指定自定义的比较函数,例如

bool compare(const A& a1, const A& a2){...}
multiset<A, decltype(compareA)*> set1(compare);


其中比较操作类型为函数指针。

pair类型

头文件:utility

访问权限:public

成员:first、second

创建方式:

括号初始化或列表初始化

make_pair(v1,v2)

pair

11.3 关联容器操作

类型别名(通过域操作符使用)

key_type:键类型

mapped_type:值类型

value_type:对于set为键类型,对于map为pair类型;

注:map的value_type所生成的pair,其键类型为const类型。

迭代器

无论是否为const迭代器,都不可以改变键;

常用inserter插入值或对;

泛型算法

一般使用关联容器自带的find算法。

通过inserter来将关联容器作为一个目的位置。

不存在copy(c.begin(),v.end(),back_inserter(c))。

删除:实参为键或迭代器

下标

注:关联容器的下标返回类型与解引用迭代器返回类型不同。下标返回mapped_type,而解引用返回value_type。

find与count

可以避免下标带来的键增加;

利用关联容器中,键相同的元素相邻存储的特性,可以结合find与count,利用迭代器遍历同键元素。

注:通过lower_bound和upper_bound迭代器也可以实现相似操作。

11.4 无序容器

组织方式:哈希函数和==运算符

有序容器与无序容器可以实现相互转化;

存储方式:桶(性能依赖于哈希函数及桶的数量和大小);

生成哈希值

使用hash类型对象生成

标准库为内置类型定义了hash模板

自定义类型需要提供自己的hash模板

//未重载 == 运算符
unordered_multiset<Class, decltype(hasher)*, decltype(eqOp)*>;
//重载了 == 运算符
unordered_multiset<Class, decltype(hasher)*>;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: