1、set的声明如下,T就是set底层关键字的类型;

2、set对T要求比较大小,默认要求T支持小于比较的就可以了,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数;

3、set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数——这一点不需要管;

4、一般情况下,我们都不需要传后两个模版参数;

5、set底层是用红黑树实现的,红黑树我们已经知道是平衡二叉树,增删查效率是O(logN) ,迭代器遍历是走的搜索树的中序,左根右,所以是有序的;

6、前面部分我们已经介绍了vector / list等容器的使用,因为STL容器接口设计高度相似,所以这里我们就不再一个接口一个接口的介绍,而是直接带大家看文档,挑比较重要的接口进行介绍。

代码语言:javascript

AI代码解释

template < class T,              // set::key_type/value_type
    class Compare = less<T>,     // set::key_compare/value_compare
    class Alloc = allocator<T>   // set::allocator_type
    > class set;
2.2 看set文档

set的支持正向和反向迭代遍历(至少是双向迭代器),遍历默认按升序顺序,因为底层是二叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围for,set的iterator和const_iterator都不支持迭代器修改数据,修改关键字数据,会破坏底层搜索树的结构。

2.2.1 set的构造和迭代器

代码语言:javascript

AI代码解释

// empty (1) 无参默认构造 
explicit set(const key_compare& comp = key_compare(),
	const allocator_type& alloc = allocator_type());

// range (2) 迭代器区间构造 
template <class InputIterator>
set(InputIterator first, InputIterator last,
	const key_compare& comp = key_compare(),
	const allocator_type & = allocator_type());

// copy (3) 拷贝构造 
set(const set& x);
// initializer list (5) initializer 列表构造 
set(initializer_list<value_type> il,
	const key_compare& comp = key_compare(),
	const allocator_type& alloc = allocator_type());

// 迭代器是一个双向迭代器 
iterator->a bidirectional iterator to const value_type
// 正向迭代器 
iterator begin();
iterator end();
// 反向迭代器 
reverse_iterator rbegin();
reverse_iterator rend();
2.2.2 拷贝构造

set的拷贝构造都是深拷贝,代价极大。


3 ~>​ set的使用层详解

3.1 增删查
3.1.1 增:insert插入

3.1.2 删:erase删除

erase是直接把值删掉——

3.1.3 查

3.1.4 单纯判断在不在:count

判断在不在很方便,在就返回0,不在返回非0——

3.1.5 lower_bound和upper_bound

3.2 insert和迭代器遍历
3.2.1 代码实现

set遍历完自带去重和有序(中序遍历)——

3.2.2 运行演示

3.3 find和erase
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐