C++ primer笔记----关联容器

1、 关联容器与顺序容器有着根本的不同;关联容器的元素是按关键词来保存和访问的,顺序容器是按他们在容器中的位置来顺序访问

2、关键词在关联容器中起到重要的作用,map中的元素是(关键字—值)对,关键词起到索引的作用,值是与索引相关联的数据。set每个元素只包含一个关键字,支持高效的关键词查找

3、标准库提供8个关联容器,主要是map/set,是否重复关键字,顺序保存容器与否

4、map的定义及使用
1:包含map头文件,2:指定关键词和值的类型,3:关键词可作为下标,索引对应值

5、size_t是一种机器相关的无符号类型,它被设计的足够大以便能保存内存中的任意对象的大小,在使用数组下标时,经常会用到此类型

6、对map对象进行下标操作,如若关键字不在map中,下标运算符会在map中创建一个新元素(关键词),对应值为默认初始化值。

7、从map对象中提取一个元素时,会得到一个pair对象,其保存两个public数据对象,first为其关键字,second为其对应值。

8、这几个容器的主要用法:
map:存储字典型数据
set:坏值检验,只有关键字的好处
list:任意位置任意删除添加数据
deque:信息处理,只在头部
vector:相关联数据,顺序处理

9、set的定义与使用,与map值差一个值而已,它只有关键字

10、set对find()的使用,返回一个迭代器,如果给定的关键词在set中,迭代器指向该关键词,如不在,则返回尾后迭代器

11、头文件:#inlude <cctype.h>ispunct() 函数用来检测一个字符是否为标点符号或特殊字符,其原型为:int ispunct(int c);

12、关联容器不支持顺序容器的位置相关操作,如:push_back、push_front,因为其是按关键字存储的

13、关联容器的迭代器都是双向的,还有一些关于哈希性能的操作

14、multimap和multiset允许多个元素具有相同的关键字,所以给multiset和multimap中传入相同的元素,是可行的,而set、map会忽略相同关键字的元素

15、set和list的区别是set中的元素不可以重复、且有序。

16、pair,标准库类型,保存在头文件utility中。保存两个数据成员,类似容器。

17、关联容器额外的类型别名:使用作用域运算符来提取一个类型的成员
key_type:表示此容器类型的关键字类型
mapped_type:每个关键字关联的类型,只适用于map
value_type:对于set,与key_type相同,对于map,为pair<const key_type,mapped_type>

18、当解引用一个关联容器的迭代器时,我们会得到一个类型为容器的value_type的值的引用;map的value_type是一个pair,我们可以改变pair的值,但是不能改变关键字成员的值

19、set的迭代器是const的,关键字是const

20、insert有两个版本,分别接受一对迭代器,或是一个初始化器列表

21、对一个map进行insert操作时,必须记住元素类型是pair,可以在insert的参数列表中创建一个pair,在参数列表中使用花括号初始化

22、insert()在关联容器中添加一个元素或者一个元素范围,由于map和set没有重复关键字,所以插入相同的元素不会产生任何影响

23、insert的返回值依赖于容器类型与元素类型,对于不包含重复关键字的容器,insert返回一个pair,第一个成员是指向具有指定关键字的元素,第二个元素是一个bool值,指出插入元素是已经在元素中还是插入成功,若关键词已在容器中,insert什么都不做,第二个参数变为false

24、递增计数器:ret.first是pair的第一个成员,是map的迭代器,->之后,解引用迭代器,提取的是map中的元素,也就是一个pair,找到此元素的第二个值,进行递增操作

25、和顺序容器一样,我们可以向erase()传入一个迭代器或者一个迭代器对来删除元素,函数返回void,还有一个版本的erase()接收一个key_type的参数,删除每个关键词为参数的元素,返回一个size_type,指出被删除元素的数量

26、set不支持下标操作,map和unordered_map支持下标操作,multimap和unordered_multimap也没有下标操作,因为有相同的元素

27、map的下标操作接受一个索引(关键词),获取的是此关键词相关联的值(即mapped_type值),但是若map中无此关键词,则它会创建一个新的元素并插入到map中,关联值将进行值初始化

28、c.at(k):访问关键词为k的元素,若k不在c中,抛出out_of_range异常;c[k]返回关键字为k的元素;如果k不在c中,添加一个关键字为k的元素,对其进行值初始化。

29、map的下标操作(返回mapped_type)与解引用迭代器*(返回value_type)返回值不同

30、对于map和set中的元素查找以及计数使用find和count,都接受关键字,find返回关键字指向的元素的迭代器或者尾后迭代器,count返回关键字的数量

31、map的下标操作可能会造成副作用,插入我们不想插入的元素,可以用find代替寻找元素

32、lower_bound和upper_bound找不到关键词的话,会指向一个不影响排序的关键词插入位置;如果两者都返回相同的迭代器,则给定关键字不在容器中

33、equal_range()函数,接收一个关键字,返回一个迭代器pair,若关键字存在,第一个迭代器指向该关键字匹配的元素,第二个关键字指向最后一个元素匹配之后的位置,如关键字不存在,两个迭代器都指向关键字可以插入的位置

34、无序版本优势:当容器中key没有明显的顺序关系时更有用,且不需要耗费多余的时间来维护容器中的key序列
有序版本优势:当容器中key有明显的顺序关系时更有用,且我们不需要考虑排序问题,容器自动维护序列(字典序)

35、map的key_value是有序的,set本身就是有序的,有序容器的操作可以用于无序容器

36、无序容器访问元素时,首先计算元素的哈希值,它指出应该搜索那个桶,因为容器将具有一个特定哈希值的所有元素都保存在一个桶中

猜你喜欢

转载自blog.csdn.net/qq_38224589/article/details/82182381