- 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;
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;
}
三、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(auto it:*st)
cout<<it<<" ";
cout<<endl;
}
int main()
{
set<int> st;
st.insert(7);
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;
cout<<"find值3:"<<*(st.find(3))<<endl;
cout<<"删除3";
st.erase(st.find(3));
printSet(&st);
cout<<"删除4";
st.erase(4);
printSet(&st);
cout<<"删除5和6";
set<int>::iterator it1 = st.begin();
set<int>::iterator it2 = st.find(7);
st.erase(it1, it2);
printSet(&st);
cout<<"清空:";
st.clear();
cout<<"set尺寸:"<<st.size()<<endl;
return 0;
}
四、其他
- set内部使用红黑树实现
- C++11标准中增加了unorder_set,内部用散列代替了红黑树,可以用来处理只去重不排序的情况,速度比set快很多