set简介
- set是按照一定次序存储元素的容器
- 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。
- 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。
- set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。
- set在底层是用二叉搜索树(红黑树)实现的。
set的使用
1.set的构造
set (const Compare& comp = Compare(), const Allocator& = Allocator() );------------------------构造空的set
set (InputIterator first, InputIterator last, const Compare& comp = Compare(), const Allocator& = Allocator() );-------------------用[first, last)区间 中的元素构造set
set ( const set<Key,Compare,Allocator>& x); ------------set的拷贝构造
2.set的迭代器
iterator begin() ------------返回set中起始位置元素的迭代器
iterator end() ---------------返回set中最后一个元素后面的迭代器
const_iterator cbegin() const ----------返回set中起始位置元素的const迭代器
const_iterator cend() const ----------返回set中最后一个元素后面的const迭代器
reverse_iterator rbegin() ----------返回set第一个元素的反向迭代器,即end
reverse_iterator rend()----------返回set最后一个元素下一个位置的反向迭代器,即 rbegin
const_reverse_iterator crbegin() const----------返回set第一个元素的反向const迭代器,即cend
const_reverse_iterator crend() const----------返回set最后一个元素下一个位置的反向const迭代器,即crbegin
3.set的容量
bool empty ( ) const ------检测set是否为空,空返回true,否则返回true
size_type size() const -------返回set中有效元素的个数
4.set的修改
pair<iterator,bool> insert ( const value_type& x )---------------在set中插入元素x,实际插入的是<x, x>构成的键值对, 如果插入成功,返回<该元素在set中的位置,true>,如果 插入失败,说明x在set中已经存在,返回<x在set中的位 置,false>
void erase ( iterator position )-------- 删除set中position位置上的元素
size_type erase ( const key_type& x )--------删除set中值为x的元素,返回删除的元素的个数
void erase ( iterator first, iterator last )--------删除set中[first, last)区间中的元素
void swap ( set<Key,Compare,Allocator>& st );--------交换set中的元素
void clear ( ) --------将set中的元素清空
iterator find ( const key_type& x ) const--------返回set中值为x的元素的位置
size_type count ( const key_type& x ) const--------返回set中值为x的元素的个数
set使用举例
#include<set>
#include<iostream>
#include<functional>
using namespace std;
void test()
{
set<int> s;//空的set对象s
int array[] = {0,1,2,3,4};
set<int,greater<int>>> s1(array,array+5);//通过array数组构建s2,这里用到greater<int>及由大到小顺序排列
set<int> s2(array,array+5);
set<int, greater<int>> copy(s1);//set的拷贝构造
set<int, greater<int>>::iterator it = s1.begin();//使用set迭代器
//set元素不能修改
//遍历有序: 搜索树的中序遍历
while (it != s1.end())
{
cout << *it << " ";
//*it = 100;//不能修改
++it;
}
cout << endl;
//set的反向迭代器
set<int, greater<int>>::reverse_iterator rit = s1.rbegin();
while (rit != s1.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
s2,insert(6)//s2中插入6
s2.insert(6);//插入会失败,set中不会插入重复的元素
s2.insert(s2.begin(),15);//在s2.begin()位置插入15,但是实际还是按照大小顺序插入,顺序为0,1,2,3,4,6,15
int array2[] = { 9, 7, 20, 0 };
s2.insert(array2, array2 + 4); //在s2中插入array2的元素,同样也不会有重复并且按照大小顺序插入
//删除最左值
s2.erase(s2.begin());
auto it = s2.begin();
auto it2 = ++s2.begin();
cout << *it << endl;
cout << *it2 << endl;
//删除会导致当前位置的迭代器失效, 不影响其他位置的迭代器,失效的迭代器需要重新获取
s2.erase(it);
cout << *it2 << endl;
//set的查找
set<int>::iterator it = s2.find(3);
if (it != s2.end())
cout << *it << endl;
else
cout << "未找到" << endl;
cout<<s2.count(3)<<endl;//打印s2中3出现的次数
}
int main()
{
test();
}