介绍
set
是一个封装红黑树 (自平衡二叉树) 的关联容器,其中元素依据其值自动排序且每个元素仅能出现一次。
set
容器定义于头文件 <set>
,其声明如下:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
set
容器是一个类
初始化
set
容器需要指定排序规则,有两种方式可指定:
- 元素类型重载小于号运算符。
strcut T { …… // 各种参数 // 该函数声明必须这样写 friend bool operator <(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } };
- 以 类型参数 定义,需要定义一个 函数对象。如
set<T,greater<T> >
。struct Cmp { bool operator()(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } }; class Cmp { public: bool operator()(const T& a,const T& b) { // check(a,b)为 a < b 成立条件 return check(a,b) ? true : false; } }; // 这两个 Cmp 是等价的 set<int,Cmp> s;
以下构造函数都不涉及定义排序规则,均采用默认排序规则——升序。
-
set<T> st;
创建一个空的set
容器。set<int> st;
-
set<T> st({num1,num2,……});
创建一个以初值列元素为初值的set
容器。set<int> st({0,1,2,3,8});
-
set<T> st = {num1,num2,……};
创建一个以初值列元素为初值的set
容器。set<int> st = {0,1,2,3,8};
-
set<T> st(st1);
创建一个 st1 的同型拷贝 (所有元素都被复制)。set<int> st1 = {1,2,8,4}; set<int> st(st1); ``
-
set<T> st = st1;
创建一个 st1 的同型拷贝 (所有元素都被复制)。set<int> st1 = {1,2,8,4}; set<int> st = st1;
-
set<T> st(begin_iterator,end_iterator)
创建一个以迭代器区间为 [begin_iterator,end_iterator) 作为元素初值的set
容器。set<int> st1 = {1,2,8,4}; set<int> st(st1.begin(),st1.end());
修改
set
容器禁止修改元素内容。
查询
empty()
判断set
容器是否为空。size()
返回set
容器中的元素个数。max_size()
返回set
容器大小的理论极限值,即当前内存情况下,允许创建set
容器中元素个数的最大可能值。count(key)
返回set
容器中元素值为 key 的元素个数。在set
容器中,返回值为 0 或 1。find(key)
判断set
容器中是否存在元素值为 key 的元素,存在返回相应迭代器,否则返回end()
。
比较
按照字典序列比较 set
中的值。
- operator ==
- operator !=
- operator <
- operator <=
- operator >
- operator >=
if(st == st1)
{
cout << "st == st1" << endl;
}
增加
insert(value)
向set
容器中插入一个元素 value。
其返回值为pair<set<T>::iterator,bool>
,set<T>::iterator
指向插入元素位置的迭代器,bool
表示插入是否成功 (如果容器中存在该值,则会插入不成功)。set<int> st = {1,3,10,5,2,99,8}; pair<set<int>::iterator,bool> result = st.insert(1);
insert(begin_iterator,end_iterator)
向set
容器中插入迭代器区间 [start_iterator,end_iterator) 内的所有元素,元素可能插入不成功。无返回值。set<int> st = {1,3,10,5,2,99,8}; set<int> st1 = {1,4,8,5}; st.insert(st1.begin(),++(++st1.begin())); // 此时 st 容器元素依次为:1,2,3,4,5,8,10,99 // 元素 1 插入失败,元素 4 插入成功
删除
clear()
清空set
容器。erase(pos_iterator)
移除set
容器指定迭代器位置 pos_iterator 的元素。set<int> st = {1,3,10,5,2,99,8}; st.erase(st.begin()); // 此时 set 容器元素依次为:2,3,5,8,10,99
erase(begin_iterator,end_iterator)
移除set
容器指定迭代器位区间 [begin_iterator,end_iterator) 中的所有元素。set<int> st = {1,3,10,5,2,99,8}; st.erase(st.begin(),++(++st.begin())); // 此时 set 容器元素依次为:3,5,8,10,99
erase(value)
移除set
容器中元素值为 value 的元素 (如果存在的话)。返回值表示移除元素个数,在set
容器中返回值只能为 0 或 1。
其他操作
equal_range(num)
返回元素值等于 num 的迭代器区间。
其返回值为pair<set<T>::iterator,set<T>::iterator>
,set<T>::iterator
指向第一个元素值等于 num 的迭代器位置,第二个set<T>::iterator
指向最后一个元素值等于 num 迭代器位置的下一个位置。set<int> st = {1,3,10,5,2,99,8}; pair<set<int>::iterator,set<int>::iterator> result = st.equal_range(3);
lower_bound(num) / upper_bound(num)
返回首个元素值 ≥ n u m \ge num ≥num 的元素迭代器位置。
返回首个元素值 > n u m > num >num 的元素迭代器位置。
两者返回值刚好构成equal_range()
的返回值。