28map,set关联式容器

序列式容器 vector、list、deque(单纯的纯数据)

关联式容器 map、set,哈希,,,(数据之间有很强的关联性,不是单纯的为了存储数据)

Set

底层是搜索树(红黑树)

T是key ,compare是仿函数,alloc是空间配置器(暂不用管)

set不支持修改 *it=10(错误)

遍历出来的结果是升序(中序遍历)不允许有重复值

set可以用范围for,因为他支持迭代器

pair 

是个类

set的insert会判断是否有重复的,重复就不插入(所以有bool类型判断)返回类型是pair

insert的返回值  第一个参数是iterator,第二个是bool

pair有两个成员  第一个first ,第二个second

 类外面用要指定内域

erase

删除是指即使不存在的位置也没有什么影响(返回值是size_type=size_t)

可以删除指定位置(位置是find返回的迭代器位置)

 

如果找的不存在返回的就是end()迭代器不存在的位置删除会报错

erase(end)就会崩溃

删除不存在的值没影响

find

找到就返回该位置的迭代器,找不到就返回end

lower_bound

给一个值,返回一个迭代器 

如果lower_bound(25)也是删除30-60,他返回大于等于(upper返回>val的值)val值的迭代器

 equal_range

返回这个值和比他大的另一个值

first是>=val的值,second是>val的值

count 

返回val的个数(判断在不在)

multiset

允许已经存在的节点再次插入(变异搜索树)

遇到相同放在左右都一样,长了就旋转

那他的迭代器返回那一个重复的元素呢?返回中序第一个val

equal-range对于mutiset来说可以删除指定重复的所有这个数

此时count()在这里就可以方便查询重复元素个数

erase()在mulset中 他把重复的数都删除了,删除多少个可以返回一个size_t

总结:查找在不在,排序+去重

而multiset也可以去重

map

key v模型,底层是树

他有两个模版参数

insert

两个模版参数但是insert只有一个值,这个值是value—type类型的值,他的value—type

是一个pair类型,有两个模版参数first是key,second是val

注意这里key前面是const,set不可以修改,map是不想key被修改,只让val修改

(const也不用写内部会转换)

但是first也可以不写const 为什么呢?(内部会转换)

同一个模版模版参数不一样就是不一样的类型

string形参是const string

pair支持带参的构造和无参的构造,和拷贝构造(原因就在这)

 此时如果传const string,string就是拷贝构造,如果传const char*,const char*就变成了构造

 make pair函数模版

函数模版特点就是可以自己推演模版参数

pair用的时候需要显示的实例化,而makepair他会自己推导

而makepair他会自己推导 ,基于上面解释过为什么以传const char*类型,这里就不仅可以判断出,right,和右边的类型是const char*(pair有构造),而且可以传两个string对象 

 插入的是pair类型所以迭代器*it=是pair *it.first是第一个值,second是第二个值

 

list<Date>自定义类型指针用的是-> 

第一个->是函数调用调用重载函数返回的是pair*再->指向first

 这里范围for加上引用,dict装换成迭代器 it 然后*it(*it里面还是string,代价大)一次给kv不加引用就是拷贝

其次first不能修改,second可以修改,kv前面没有const,不然first和second都不能修改

那为什么first不能修改?因为pair里面first前面有const

map统计次数

ret是个迭代器用迭代器让second++

 

 mat【】

这里的[ ]是你给的这个key(str)他返回这个key对应的val,并且是这个val(次数)的引用

ke_type是key的类型,mapped_type是val的类型

水果第一次出现(countMap【str】)先插入 ,0次返回(水果所在的)迭代器,迭代器.second是0,0++,变成1次,再插入就插入失败只返回第已存水果的迭代器,val一直++,

第一个erase相当于插入(size++)没有val(val用的是默认构造,int是0char是/0,指针是空指针)

 第二个erase查找erase已经存在,返回已存在的erase,key的迭代器

第三个再查找

第四个test插入+修改 相当于(*it)->first=“测试”

第五个test插入+修改 相当于(*it)->first=“左边,剩余”

multimap

不能像上面一样统计次数了因为它允许重复内容插入

不支持【】,跟map比只是键值冗余(有重复的值)

不支持【】因为有多个重复的元素(key),有【】对个key到底返回谁?

map不关注val的问题如果key相同就认为已经有了不会看val

  sort可以对pair排序

排序依据key小就小,可以不小的话看val小就小

交集差集思路

 set可以有序加去重

相关推荐

  1. 哈希封装unordered系列关联容器

    2024-04-23 00:44:07       15 阅读
  2. C++关联容器

    2024-04-23 00:44:07       38 阅读
  3. c++关联容器详细介绍

    2024-04-23 00:44:07       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 00:44:07       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 00:44:07       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 00:44:07       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 00:44:07       18 阅读

热门阅读

  1. 《1w实盘and大盘基金预测 day25》

    2024-04-23 00:44:07       12 阅读
  2. 笨蛋学C++【C++基础第三弹】

    2024-04-23 00:44:07       11 阅读
  3. element UI 走马灯 initial-index动态赋值 不生效问题

    2024-04-23 00:44:07       12 阅读
  4. 【华为OD机试】最长连续手牌【C卷|200分】

    2024-04-23 00:44:07       9 阅读
  5. 金融风险评估都有什么模型

    2024-04-23 00:44:07       13 阅读
  6. iOS(Object C) 冒泡排序

    2024-04-23 00:44:07       14 阅读
  7. Android R 展讯平台关机充电动画横屏显示修改

    2024-04-23 00:44:07       13 阅读
  8. PyTorch: 点燃深度学习革新之火

    2024-04-23 00:44:07       16 阅读
  9. 用爬虫玩转石墨文档

    2024-04-23 00:44:07       15 阅读
  10. linux kernal配置移植 (简录)

    2024-04-23 00:44:07       12 阅读