1.定义
set,就是数学上的集合——即set中的每一个元素只能出现一次,并且set中的元素是已经从小到大排好序的,使用set需要引入头文件#include<set>
2.基本函数
2.1构造函数
- std::set<int> se:创建一个空的set
- std::set<int> se{1,2,3,4,5}:创建一个拥有元素1,2,3,4,5的set
- std::set<int> se1(se):创建一个和se相同的set
- std::set<int> se2(se1.begin(),se1.end()):创建一个拥有[se1.begin(),se1.end()]之间元素的set
2.2.添加元素
- se.insert(4):添加一个元素4
- se.insert(pos,7):在pos处添加元素7,但是最后se中的元素会重新排好序
2.3.删除元素
- se.erase(5):删除一个元素5
- se.erase(se.begin(),++se.begin()):删除[begin(),++begin()]之间的元素
- se.clear():清空set中的所有元素
2.4.set重要的迭代器
- se.begin():返回正向迭代器的第一个元素
- se.end():返回正向迭代器的最后一个元素的下一个位置
- se.rbegin():返回反向迭代器的第一个元素,即vector中的最后一个元素
- se.rend():返回反向迭代器的最后一个元素的下一个位置,即vector中的第一个元素的前一个位置
2.5.其他函数
- se.size():set的大小
- se.empty():判断se的大小
- se.count(key):查找键key的元素个数
- se.find(key):如果存在key,返回key所对应的迭代器,否则返回se.end()
- se.upper_bound(key):返回第一个元素大于key的迭代器
- se.lower_bound(key):返回最后一个元素小于key的迭代器
- swap():交换两个set
- se.emplace()
3.使用实例
3.1.排序
对set的运算符重载使得其可以对非标准类型进行排序
#include<iostream>
#include<set>
#include<string>
struct Infomation
{
std::string name;
int score;
bool operator < (const Infomation &a) const
{
return a.score > score;
}
};
void main(){
std::set<Infomation> se;
Infomation info;
info.name = "haha";
info.score = 30;
se.insert(info);
info.name = "hahaha";
info.score = 40;
se.insert(info);
info.name = "hahahaha";
info.score = 60;
se.insert(info);
for (auto ll : se)
{
std::cout << ll.name << " ";
}
std::cout << std::endl;
}
或者选择重载()
#include<iostream>
#include<set>
#include<string>
struct Infomation
{
std::string name;
int score;
};
typedef struct{
bool operator()(const Infomation lhs, const Infomation rhs){
return lhs.score < rhs.score;
}
}compare;
void main(){
std::set<Infomation,compare> se;
Infomation info;
info.name = "haha";
info.score = 30;
se.insert(info);
info.name = "hahaha";
info.score = 40;
se.insert(info);
info.name = "hahahaha";
info.score = 60;
se.insert(info);
for (auto ll : se)
{
std::cout << ll.name << " ";
}
}
3.2.添加一个非标准元素
我们除了可以使用insert添加非标准元素,还可以使用emplace和emplace_hint快速添加元素,不同的是两者返回值不同,emplace返回一个迭代器和是否加入成功的pair,而emplace_hint只是返回迭代器。且emplace_hint比emplace多需要一个迭代器参数
#include<iostream>
#include<set>
#include<string>
struct Infomation
{
std::string name;
int score;
Infomation(std::string _name, int _score) : name(_name), score(_score){}
};
typedef struct{
bool operator()(const Infomation lhs, const Infomation rhs){
return lhs.score < rhs.score;
}
}compare;
void main(){
std::set<Infomation,compare> se;
se.insert(Infomation("haha",30));
se.insert(Infomation("hahaha", 40));
se.insert(Infomation("hahahaha", 60));
se.emplace("az", 10);
auto iter=se.emplace_hint(se.begin(),"xx", 20);
for (auto ll : se)
{
std::cout << ll.name << " ";
}
}