• 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常用操作

  • 设有set集合变量​​st​

操作

代码

时间复杂度

说明

插入元素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快很多