一、关联式容器
1、在学习map和set之前,我们学习过的容器有:vector、list、stack、queue等,因为其底层为线性序列的数据结构,里面存储的是元素本身,所以这些容器统称为序列式容器。
2、关联式容器也是用来存储数据的,但是与序列式容器不同的是,里面存储的是键值对,在数据检索的时候效率比序列式容器高。
3、在STL中,总共实现了两种类型的关联性容器:树形结构与哈希结构,树型结构的关联式容器主要有四种:map、set、multimap、multiset。 这四种容器的共同点是:底层使用的是红黑树去实现的,容器中的元素是一个有序的序列。
二、键值对
用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。最典型的例子就是用字典查英语单词,在字典中我们根据英文单词去查找对应的中文含义,英语单词与中文含义是一一对应的关系,通过键值对存储起来他们之间的一个映射关系,这样在词典中就可以找到对应的中文信息。
三、set
3.1set的介绍
1. set是按照一定次序存储元素的关联性容器
2. 在set中,键值对为<value,value>,并且每个value都是唯一的。set中的元素不能在容器中直接修改,但是可以从容器中插入或删除它们,从而间接修改。
3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则(不允许存在相同的关键字)进行排序。
4. set在底层是用红黑树实现的。
注意:
1. 与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。
2. set中插入元素时,只需要插入value,不需要构造键值对<value,value>。
3. set中的元素不可以重复(故可以使用set进行去重)。
4. set中的元素默认按照小于来比较(可以通过仿函数改成想要的排序方式)
5. set中查找某个元素的时间复杂度为:log2n(因为底层是红黑树)
3.2set的使用
3.2.1、构造函数
1、set<类型>
2、迭代器区间构造
3、拷贝构造
3.2.2、迭代器
3.2.3、insert
1、insert是插入一个value,返回值是pair<iterator,bool>,其中iterator是无论你是插入成功还是插入失败,都会返回这个新插入元素(或者原先就有的元素)的迭代器iterator,bool是插入成功为true,失败为false;(如果set有该元素则插入失败,否则插入成功)
3、迭代器区间插入。
3.2.4、find
find的就是去set容器中找到对应键值并返回他对应的迭代器,如果找不到,就会返回end( )迭代器 为线性查找
3.2.5.count
count的作用是为了参数对应的这个键值在set中有几个,但是因为set是不允许键值冗余的,所以其实其可能的结果要么是0要么是1,对应的就是有或者没有。此处用处不大,但在下面的multiset中有意义,因为multiset是允许键值冗余的。
3.2.6.erase
1、传一个迭代器删除。
2、传一个我们想要删除的value去删除
3、删除set中指定的一块迭代器区间。
四、map
4.1map的介绍
1. map也是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元
素。
2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的
内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型
value_type绑定在一起,为其取别名称为pair: typedef pair<const key, T> value_type;
3. 在内部,map中的元素总是按照键值key进行比较排序的。
4. map支持下标访问符,即在[]中放入key,就可以找到与key对应的value。
5. map实现平衡二叉搜索树(红黑树)。
Compare: 比较器的类型,map中的元素是按照key来比较的,缺省情况下按照小于来比较,一般情况下(内置类型元素)该参数不需要传递,如果无法比较时(自定义类型)或者想按照用户需求比较,则需要用户自己显式传参比较规则(一般情况下按照函数指针或者仿函数来传递)
4.2map的使用
4.2.1构造函数
1、空map
2、迭代器区间构造map
3、拷贝构造
4.2.2insert
和set类似,此时插入的是键值对
4.2.3erase
1、删除指定迭代器位置的键值对
2、删除键值为k的键值对,返回是否删除成功
3、删除一段迭代器区间。
4.2.4find
通过键值去找到并返回其对应的迭代器。如果没找到,就返回end()的迭代器。
4.2.5count
在map中判断有无,在multimap中可以判断key对应键值对的个数。
4.2.6 [ ] 重载
它的返回值如下
this指针调用了insert函数,并返回了对应的pair<iterator,bool> ,他的first对应的是迭代器,second对应的是该迭代器的value。无论插入成功还是失败都会返回对应位置的迭代器。如果是第一次插入的话,insert中的value是一个默认构造,在该题中是int类型,所以默认构造是0(如果是string的话,就是空串)。
重载[ ]的方括号可以帮助我们完成4个任务
1、插入(value是默认构造)
2、插入+修改(value是默认构造,但是返回后可以直接进行修改)
3、修改(找到对应键值的value并修改)
4、查找