序列式容器 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可以有序加去重