一、关联容器:
关联容器与顺序容器的本质区别是,不是通过index(offset),而是通过key来存取value的。
C++关联容器包括map,multimap,set,multiset四种,他们的内部实现数据结构都是红黑树(红黑树具体原理参见数据结构篇之红黑树)。其中map和set要求同一个key只能对应一个value,不能有同一个key对应着不同的value,而multimap和multiset可以使相同的key对应不同的value。
关联容器共享顺序容器的大部分操作,除了:front,push_front,pop_front,back,push_back,pop_back,即不支持与位置相关的操作。
1. pair:
1.1. STL pair的实现原理
定义了两个成员变量的结构体,重载了一些操作符,例如“==”,“<”。
2. map:
1.1. 注意事项:
(1)实际工作中需要注意键类型要重载"<"操作符。
(2)map可以有自己的迭代器,用来遍历map,map iterator的类型是bidirectional iterator。
(3)map key所存放的对象必须有“<”操作符,例如list的iterator由于没有"<"操作符,所以不能用作map的key。
(4)map key为const类型,不能进行写操作。
(5)map按照key顺序排列。
1.2. 操作:
(1)map添加对象包括两种方式:
方式一(下标):map[keyName] = valueName
与顺序容器下标访问的区别是:
a)用下标访问一个不存在的key,会创建一个新的key-value对,value初始化为0或者构造函数创建的值。
因为下标访问分为两步:
首先判断key不存在,创建key-value,value初始化;
然后再给value进行赋值操作。
b) map使用iterator解引用和下标访问获得的对象类型不同,前者是pair对,后者是mapped_type也就是value的类型。
方式二(insert函数):
insert函数插入pair类型的数据,返回值仍然是一个pair类型的数据,pair中存放的是迭代器和一个bool值,其中迭代器指向map中插入的元素,bool值表示是否插入成功。
3. set:
set仅仅是key的集合,应用场景为仅仅需要判断一个value存在不存在,而不需要对value本身进行存取。
set不支持下标操作符。
set存储的key必须是唯一的,且不能修改。
set按照key顺序排列。
4. multimap和multiset:
multimap和multiset允许每个key对应多个实例。
multimap不支持下标运算。
5. 附上文本查询程序,用户从指定的文件查询单词,统计该单词出现的总次数以及列出该单词出现的行,如果单词在同一行中出现多次,只列出该行一次,代码如下: