set意为集合,是一个内部自动有序,并且不含重复元素的容器,有些题目可能会要求去重操作,这时候就可以用set去解决,并且set可以实现自动排序,熟练的使用set之后可以减少某些题目的思维量,如果要使用set,需要添加头文件#include
set<typename> name;
我们发现它的定义方法其实和vector
十分类似,或者说大部分的STL容器都是如此的定义方法,这里的typename
可以使任何的基本类型,例如int, char, double
,结构体,当然也可以是其他的STL中的容器,如vector, set, queue
set<int> a;
set<double> b;
set<char> c;
set<vector<int>> s; //这里如果报错的话,写成如下样子:
set<vector<int> > s;
//报错原因是C++11以前的编译器会把这个翻译成移位操作
set只能通过迭代器(iterator)访问
set<typename>::iterator it;
迭代器的遍历方法和vector
中一致,不清楚的读者可以去看:STL—vector
这样it就是vector
类型的变量,typename
就是定义set
时候的类型,当然it也可以写成t或者其他的样子,这里写成it是习惯,有了it这个迭代器,我们就可以通过*it来访问set
中的元素,下面我们距离来说明:
s.insert(x)
是把x插入到set中,下文会做讲解
s.begin()
是v的首元素地址
s.end()
是取v的尾元素地址的下一个地址
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
当然我们可以通过auto
缩写
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
for (auto it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
输出结果为:-3 2 4 7
可以发现,set
内的元素自动单调递增且去重
s.insert(x);
可以把x
插入到set
容器中,并且自动递增排序并且去重,时间复杂度为O(logN),其中N为set
内的元素个数
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
输出结果为:-3 2 4 7
s.find(value);
返回set
中对应值为value
的迭代器,时间复杂度是O(logN),N为set
内的元素个数
#include
#include
using namespace std;
int main()
{
set<int> s;
for (int i = 1; i <= 5; i ++ ) s.insert(i);
set<int>::iterator it = s.find(3);
cout << *it;
return 0;
}
输出结果为:3
当然也可以简写成:
#include
#include
using namespace std;
int main()
{
set<int> s;
for (int i = 1; i <= 5; i ++ ) s.insert(i);
cout << *(s.find(3));
return 0;
}
s.erase(it);
,it
为所需要删除元素的迭代器,时间复杂度为O(1),可以结合find()
去使用
#include
#include
using namespace std;
int main()
{
set<int> s;
for (int i = 1; i <= 5; i ++ ) s.insert(i);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
cout << endl;
s.erase(s.find(3));
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
输出结果为:
1 2 3 4 5
1 2 4 5
s.erase(value);
,value
为所需要删除元素的值,时间复杂度为O(logN),N为set内的元素个数
#include
#include
using namespace std;
int main()
{
set<int> s;
for (int i = 1; i <= 5; i ++ ) s.insert(i);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
cout << endl;
s.erase(3);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
输出结果为:
1 2 3 4 5
1 2 4 5
s.erase(first, last);
可以删除一个区间内的所有元素,其中农first
是所需要删除区间的起始迭代器,而last
为所需要删除区间的末尾迭代器的下一个地址,即删除[first, last)
,时间复杂度为O(last - first)
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
s.insert(-10);
s.erase(s.find(-3), s.find(4));
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
return 0;
}
输出结果为:-10 4 7
s.size();
用来获得set
内元素的个数,时间复杂度为O(1)
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
s.insert(-10);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
cout << endl;
cout << s.size();
return 0;
}
输出结果为:
-10 -3 2 4 7
5
s.clear();
用来清空set
内的所有元素,时间复杂度为O(N),N为set
内元素的个数
#include
#include
using namespace std;
int main()
{
set<int> s;
s.insert(2);
s.insert(-3);
s.insert(7);
s.insert(2);
s.insert(4);
s.insert(-10);
for (set<int>::iterator it = s.begin(); it != s.end(); it ++ )
cout << *it << ' ';
cout << endl;
s.clear();
cout << s.size();
return 0;
}
输出结果为:
10 -3 2 4 7
0