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模型,底层是树,不能用sort直接排序,sprt支持随机迭代器(++ - - +, -),map是双向迭代器(++- -)

他有两个模版参数

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++

 

 map【】

这里的[ ]是你给的这个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小就小,key不小的话看val小就小(就是说有一个小就小)

交集差集思路

 set可以有序加去重

  • 16
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值