C++: map和set的使用

一、关联式容器

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、查找 

引用\[1\]中的代码展示了如何使用std::unordered_map来创建一个键值对的容器,并使用Print函数打印出容器中的元素。其中,m1是一个std::unordered_map对象,包含了键值对{1, 10}, {2, 20}, {3, 30}。通过调用Print函数,我们可以看到容器中的元素被正确地打印出来。 引用\[2\]中的内容介绍了std::set和std::map中的lower_bound和upper_bound函数。lower_bound函数返回setmap中第一个大于等于给定值的迭代器,而upper_bound函数返回第一个大于给定值的迭代器。这两个函数的设计可能与我们对lower和upper的理解有所不同,但是它们的功能是根据给定值在容器中查找元素的位置。 引用\[3\]中的代码展示了如何使用迭代器来遍历std::unordered_map容器中的元素。通过使用begin函数获取起始迭代器,然后使用end函数获取结束迭代器,我们可以使用迭代器来遍历容器中的所有元素。在代码中,使用了两种类型的迭代器,即普通迭代器和常量迭代器,分别用于修改和只读访问容器中的元素。 综上所述,std::map和std::setC++标准库中的关联容器,它们提供了不同的功能和特性,可以根据具体的需求选择使用。 #### 引用[.reference_title] - *1* *3* [std::unordered_map](https://blog.csdn.net/TimerSea/article/details/128067616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [STL中std::set、std::map的lower_bound和upper_bound](https://blog.csdn.net/qq_41883523/article/details/115798756)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值