目录
头文件:
#include <set>
定义一个set:
set<int> s;
底层逻辑:红黑树。
(输入数据有序存储,基本操作的复杂度大多为对数级)
基本操作:
int x;
int* pos;
s.insert(x);//插入元素x
clear();//清除所有元素
s.erase(x);//删除元素x
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
s.size(x);//返回s的大小
s.count(x);//返回x元素出现次数
s.begin();//返回第一个元素的迭代器
s.end();//返回最后一个元素的迭代器的下一位
s.find(x);//查找x,若存在,返回该键的元素的迭代器;若不存在,返回s.end();
s.empty();//返回set是否为空
值得一提的是:由于set本身具有元素不能重复的性质,故count的效果实际上更像查找,若找到则返回1(1个元素),未找到返回0。
代码演示:
#include <iostream>
#include <set>
using namespace std;
int main()
{
//建立并初始化一个set
set<int> s;
s.insert(2);
s.insert(0);
s.insert(2);
s.insert(2);
s.insert(2022);
s.insert(2222);
//拷贝一份
set<int>s_temp(s.begin(), s.end());
//验证size的功能和set自带的去重效果
cout << s.size() << endl;
//count的效果:判断存在与否
if (s.count(0)) cout << "Y" << endl;
else cout << "N" << endl;
//验证begin的功能
auto temp = s.begin();
cout << *temp << endl;
//验证find的功能
auto t = s.find(2022);
cout << *t << endl;
//验证eraser的功能
s.erase(0);
cout << s.size() << endl;
if (s.count(0)) cout << "Y" << endl;
else cout << "N" << endl;
//对比输出(内部是有序的)
for (auto it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << endl;
for (auto it = s_temp.begin(); it != s_temp.end(); it++)
cout << *it << " ";
return 0;
}
结果如下:
4
Y
0
2022
3
N
2 2022 2222
0 2 2022 2222
补充:unorder_set——无序集合
底层逻辑:哈希表
(输入数据无序存储,基本操作的复杂度大多为常数级)
定义一个无序集合:
unordered_set<int> s;
其他操作方法与set相同。