set 学习笔记

一、声明

1.头文件

\(include<set>//包括set和multiset两个容器\)

2.声明

\(set<int> s\)
s自带一个维度

二、迭代器

对“迭代器”的理解:迭代器可以理解为\(set\)数组的下标。

1.声明

\(it\)是一个迭代器,则声明为
\(set<int>::iterator it\);

2.可执行操作

(1)“++” “--” 时间复杂度\(O(logn)\)

(2)“*”解除引用

对“解除引用”的理解:在解除引用之前,\(it\)无法作为一个值来使用,它指向一个元素。

下面代码会报编译错误:

#include<iostream>
#include<set>
using namespace std;
set<int> s;
set<int>::iterator it;
int main()
{
	int n;
	cin>>n;
	for(int i=1,x;i<=n;i++)
	{
		cin>>x;
		s.insert(x);
	}
	for(it=s.begin();it!=s.end();it++)
	{
		cout<<it<<" ";
	}
}

但给\(it\)加上“解除引用”就能过编译了。

#include<iostream>
#include<set>
using namespace std;
set<int> s;
set<int>::iterator it;
int main()
{
	int n;
	cin>>n;
	for(int i=1,x;i<=n;i++)
	{
		cin>>x;
		s.insert(x);
	}
	for(it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<" ";
	}
}

另外,以上程序还有一个特性:

input:
6
1 1 4 5 1 4
output:
1 4 5

就实现了排序+去重。

三、功能

1.size/empty/clear

分别表示元素个数/是否为空/清空

2.begin/end

返回集合的首、尾迭代器,时间复杂度\(O(1)\)
\(s.begin()\)是指向集合中最小元素的迭代器;
\(s.end()\)是指向集合中最大元素的下一个位置的迭代器。

遍历\(set<int> s\)

for(it=s.begin();it!=s.end();it++)

注意,不能写成下面这种形式:

for(it=s.begin();it<s.end();it++)

因为\(it\)不支持这种运算。

3.insert/erase

\(s.insert(x)\)把一个元素\(x\)插入到集合\(s\)中,时间复杂\(O(logn)\)
\(set\)中,若元素已存在,则不会重复插入该元素,对集合的状态无影响。

\(it\)是一个迭代器,\(s.erase(it)\)\(s\)中删除迭代器\(it\)指向的元素,时间复杂度\(O(logn)\)
\(x\)是一个元素,\(s.erase(x)\)\(s\)中删除所有等于\(x\)的元素,时间复杂度\(O(k+logn)\),其中\(k\)为被删除的元素个数。

4.find

\(s.find(x)\)在集合\(s\)中查找等于\(x\)的元素,并返回指向该元素的迭代器。若不存在,则返回\(s.end()\)。时间复杂度\(O(logn)\)

5.count

\(s.count(x)\)返回集合\(s\)中等于x的元素个数,时间复杂\(O(k+logn)\),其中\(k\)为元素\(x\)的个数。

posted @ 2022-09-29 19:28  Fish4174  阅读(20)  评论(0编辑  收藏  举报