已知快速查找:
1.暴力查找
2.排序+二分查找(插入删除麻烦)
3.搜索树->二叉搜索树(极端情况n)->平衡树(AVL树,红黑树)(logn高度太高,搜索次数多)->多叉平衡搜索树(B树系列)
4.哈希系列
序列式容器和关联式容器
set->底层红黑树
一.仿函数
二.set
模板参数:
传一个参数类型就行,默认比较器是小于,左小右大,内存池不用管
迭代器遍历:
默认走中序,从最小的开始遍历,即 .begin()位置
删某个位置/某个值/某个位置区间
对于删某个位置:用find删要检查是否找到了,返回end删会报错
判断是否删除成功:用删某个值,接收删除成功的个数
对于某个区间:C++从来是左闭右开,右为要删除的下一个位置
交换两个根节点的指针
与算法的find
尽量用set的find,算法的find是通过遍历迭代器区间,暴力查找,set的能logn,走高度层。
用于判断某个数在不在,效率logn,返回这个数在的次数,由于set不重复键,只有0,1
返回传入值为下限,大于等于它的迭代器位置
返回值为上限,返回大于它的迭代器位置
形成一个上下限之间的位置区间,传30,传60,返回【30,60)删除传他们可以删除30到60的区间(包含)
找到和这个值相等的一段区间,放到pair里。
三.multiset
允许键冗余
-->相同的值可能放到左边或右边,会旋转。
multiset查找返回中序第一个:
有一些好处:找到第一个迭代器++就能找到下一个(迭代器遍历是中序,相等的值一定连续)---相等的值是连续的
删除删一个值,删的是所有相同的值
注意位置删除不会返回迭代器,会有迭代器失效问题
返回一个左闭右开的区间
四.pair
first,second成员,
重载了比较大小>,<,比键
五.map
map存的是pair键值对,value_type是pair,存储单元就是pair,
构造pair:
1.用make_pair自己推导
2.花括号自己隐式类型转换
3.自己写pair<T,P> ...
构造map
={{ },{ },{ }};用它的initializer_list
迭代器->返回成员结构部分,it->指向成员的成员部分
it.operator->()->。。。省略为it->。。