【C++/STL】3. set集合
原创
©著作权归作者所有:来自51CTO博客作者云端FFF的原创作品,请联系作者获取转载授权,否则将追究法律责任
- set是一个内部有序且不含重复元素的容器
- 适用于各种数据类型集合需要去重的情况
- 元素加入set后会自动排序
- set定义于
set.h
,命名空间std
一、构造函数
作用
| 代码
| 说明
|
定义一个set
| set <typename> name;
| typename可以是任何基本类型,如int/double/char/结构体... 或STL标准容器vector/set/queue... |
定义set数组
| set <typename> name[size];
| 同上
|
set<int> a;
set<double> b;
set<char> c;
set<node> d; //node是数组
set<int> A[100];
set<double> B[100];
二、访问set中元素
- set中元素只能通过
迭代器 *it
形式访问;C++11标准下,还可以用auto
进行访问。 - 禁止
*(it+i)
形式访问,也禁止通过it+1
形式找到相邻元素的迭代器 - 定义typename类型set的迭代器
set<typename>:: iterator it;
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> st;
st.insert(5);
st.insert(4);
st.insert(3);
st.insert(3);
for(set<int>::iterator it = st.begin();it!=st.end();it++)
cout<<*it<<" ";
return 0;
}
//输出3 4 5,可见set中数据自动递增排序,且去重
三、set常用操作
操作
| 代码
| 时间复杂度
| 说明
|
插入元素x
| st.insert(x)
| O(logN),N为set中元素个数
| 插入后自动排序并去重
|
查找元素值value
| st.find(value)
| O(logN),N为set中元素个数
| 返回set中对应值为value的迭代器。若找不到,返回st.end() |
删除迭代器it对应的元素
| st.erase(it)
| O(1)
| 可以结合find操作使用
|
删除值为value对应的元素
| st.erase(value)
| O(logN),N为set中元素个数
| -
|
删除两个迭代器范围内的元素
| st.erase(first,last)
| O(last-first)
| 删除[first,last)区间元素
|
获得set内元素个数
| st.size()
| O(1)
| -
|
清空set内元素
| st.clear()
| O(N),N为set中元素个数
| -
|
#include <iostream>
#include <set>
using namespace std;
void printSet(set<int> *st)
{
cout<<"打印set:";
//使用迭代器遍历
//for(set<int>::iterator it = st->begin();it!=st->end();it++)
// cout<<*it<<" ";
//C++11标准,使用auto类型遍历
for(auto it:*st)
cout<<it<<" ";
cout<<endl;
}
int main()
{
set<int> st;
st.insert(7); //insert()方法
st.insert(6);
st.insert(5);
st.insert(4);
st.insert(3);
printSet(&st);
cout<<"使用auto遍历并打印:";
for(auto i:st)
cout<<i<<" ";
cout<<endl;
cout<<"set尺寸:"<<st.size()<<endl; //size()方法
cout<<"find值3:"<<*(st.find(3))<<endl; //find(value)方法
cout<<"删除3";
st.erase(st.find(3)); //erase(iterator)方法
printSet(&st);
cout<<"删除4"; //erase(value)方法
st.erase(4);
printSet(&st);
cout<<"删除5和6"; //erase(iterator1,iterator2)方法,注意禁止用it1+3这种写法
set<int>::iterator it1 = st.begin();
set<int>::iterator it2 = st.find(7);
st.erase(it1, it2);
printSet(&st);
cout<<"清空:"; //clear()方法
st.clear();
cout<<"set尺寸:"<<st.size()<<endl;
return 0;
}
/*
打印set:3 4 5 6 7
使用auto遍历并打印:3 4 5 6 7
set尺寸:5
find值3:3
删除3打印set:4 5 6 7
删除4打印set:5 6 7
删除5和6打印set:7
清空:set尺寸:0
*/
四、其他
- set内部使用红黑树实现
- C++11标准中增加了unorder_set,内部用散列代替了红黑树,可以用来处理只去重不排序的情况,速度比set快很多