- set是一个内部有序且不含重复元素的容器
- 适用于各种数据类型集合需要去重的情况
- 元素加入set后会自动排序
- set定义于
set.h
,命名空间std
一、构造函数
作用 | 代码 | 说明 |
定义一个set | set <typename> name; | typename可以是任何基本类型,如 |
定义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常用操作
- 设有set集合变量
st
操作 | 代码 | 时间复杂度 | 说明 |
插入元素x | st.insert(x) | O(logN),N为set中元素个数 | 插入后自动排序并去重 |
查找元素值value | st.find(value) | O(logN),N为set中元素个数 | 返回set中对应值为value的迭代器。若找不到,返回 |
删除迭代器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快很多