1. 序列式容器和关联式容器
序列式容器:string,vector,list,deque,array,forward_list。
它们的逻辑结构是呈线性的数据结构,两个数据存储的位置之间没有紧密关联。
关联式容器:set,map,multiset,multimap。
逻辑结构紧密关联,通常是非线性的,位置之间如果交换了就破坏原来的结构性质,它们的底层是一颗红黑树,红黑树是一颗平衡二叉树,set是key搜索场景的结构,map是key/value搜索场景的结构。
2.set的使用
• set的声明如下,T就是set底层关键字的类型
• set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数
• set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参
数。
• ⼀般情况下,我们都不需要传后两个模版参数。
• set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序
的。
template<class T,
class Compare=less<T>,
class Alloc=allocator<T>> class set;
3.set的构造
常用的几个构造:
无参默认构造:
explicit set (const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
迭代区间构造:
template<class InputIterator>
set (InputIterator first,InputIterator last,
const key_compare& comp = key_compare(),
const allocator_type& = allocator_type());
拷贝构造:
set(const set& x);
列表构造:
set (initializer_list<value_type> il,
const key_compare& comp = key_compare(),
const allocator_type& alloc = allocator_type());
eg:
set<int> s({1,2,3,4,5});
正向迭代区:
iterator begin();
iterator end();
反向迭代区:
reverse_iterator rbegin();
reverse_iterator rend();
4.set的增删查
单个数据插入:
如果要插入的数据存在,那么插入就会失败,bool的值为flase。
pair<iterator,bool> insert(const value_type& val);
迭代区间插入:
已经存在的值不会插入。
template<class InputIerator>
void insert(InputTerator frist,InputTerator last);
查找val:
找到返回val的迭代器,没有就会返回end();
iterator find(const value_type& val);
查找val,返回val的个数:
size_type conut (const value_type& val)const;
删除一个迭代器的值:
iterator erase (const_iterator position);
删除val:
成功返回0,不成功返回1.
size_type erase (const value_type& val);
删除一个迭代区间的值:
iterator erase (const_iterator first, const_iterator last);
返回大于等于val位置的迭代器:
iterator lower_bound (const value_type& val) const;
返回大于val位置的迭代器:
iterator upper_bound (const value_type& val) const;
5.set和multiset的差异
multiset和set的使用基本完全类似,主要区别点在于multiset支持值冗余,也就是可以存在相同的值。