map&set底层都是红黑树
set
没有key, 只存val
默认中序遍历,并且为升序(s.begin()为最小)
容器的线性&非线性
序列式容器:vector/list... 线性的
关键试容器:map,set... 非线性
判断在不在set中
s.count(val)
返回一或零(数量)
s.lower_bound&s.upper_bound
控制区间边界开闭
删除[30,60]区间
注意左闭右开细节,若需要删除的是左闭右闭,那么右边界就要upper
multiset
不提供[]
排序后允许重复
find返回中序遍历时第一个(按排序便利到的第一个)
erase
删除全部指定值
map
底层也是搜索树
不允许key重复
存储pair(key&val)
按照key排序(中序)
operator[]用法
定义
调用insert
新增val为int默认0
insert返回pair<iterator,bool>
iterator指向自身或同key节点
模拟实现operator[]
返回val的引用,保证外界可改变[]返回值
operator[]的妙用
不存在的话会插入的
int i=int() 肯定为0(规定)
int i 随机
pair
给map传pair参方法:
传参用make_pair()
或{ }(多参数时隐式类型转换)
甚至一次多个pair,{{ },{ }...}
(外层inizerlist,内层隐类转换)
pair没有重载流插入与流提取
pair不能直接打印,只能单独取first(key)、second(val)依次打印
(可先解引用再. 或直接—>)(其iterater重载了->)
tips
类型太长(如迭代器),用auto替代
范围for遍历map时,e前要加引用(const auto&e:m)。不然会深拷贝
常用查找方法:
暴力查找
排序+二叉树:快,但插入和删除代价大
搜索树:搜索二叉树-> 平衡树(AVL,红黑) ->多差平衡树(B树系列)
哈希系列:哈希表
int i=int() 肯定为0(规定)
int i 随机
板书:
map&set