1.set的功能
数据存入其中后会自动去重,自带排序。
虽然set自动去重,但是仍然可以用count()求出某一点重复数据的个数 set容器中不允许重复元素,multiset允许重复元素
set在访问元素的时候不能按照下标来访问,只能做到遍历访问。我们想要按照下标来访问set内部的元素,可以把set内部的元素存放在vector里面。*
2.set常用操作:
set<int> s;
set<double> ss;
multiset<int> ms; //允许重复
set的基本操作:
s.begin() //返回指向第一个元素的迭代器
s.clear() //清除所有元素
s.count() //返回某个值元素的个数
s.empty() //如果集合为空,返回true(真)
s.end() //返回指向最后一个元素之后的迭代器,不是最后一个元素
s.erase() //删除集合中的元素
s.find() //返回一个指向被查找到元素的迭代器
s.insert() //在集合中插入元素
s.lower_bound() //返回指向大于(或等于)某值的第一个元素的迭代器
s.size() //集合中元素的数目
s.swap() //交换两个集合变量
s.upper_bound() //返回大于某个值元素的迭代器
set<int> s;
s.erase(2); //删除键值为2的元素
s.clear();
//元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。
set<int>::iterator it;
it=s.find(5); //查找键值为5的元素
if(it!=s.end()) //找到
cout<<*it<<endl;
else //未找到
cout<<"未找到";
//自定义比较函数
(1)元素不是结构体:
例:
//自定义比较函数myComp,重载“()”操作符
struct myComp
{
bool operator()(const your_type &a,const your_type &b)
[
return a.data-b.data>0;
}
}
set<int,myComp>s;
......
set<int,myComp>::iterator it;
(2)如果元素是结构体,可以直接将比较函数写在结构体内。
例:
struct Info
{
string name;
float score;
//重载“<”操作符,自定义排序规则
bool operator < (const Info &a) const
{
//按score从大到小排列
return a.score<score;
}
}
3.举例
#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int main(){
set<int> s;
//插入元素
s.insert(1);
s.insert(3);
s.insert(5);
//查找元素
set<int>::iterator ite;
ite=s.find(1); //查找键值为1的元素
if(ite==s.end()) puts("not find");
else puts("find");
ite=s.find(2);
if(ite==s.end()) puts("not find");
else puts("find");
//删除元素
s.erase(3);
//其他的查找元素的方法
if(s.count(3)!=0) puts("find");
else puts("no find");
//遍历所有的元素
for(ite=s.begin();ite!=s.end();++ite)
cout<<*ite<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
set<int> s;
int main(){
s.insert(1);
s.insert(3);
s.insert(4);
cout<<*lower_bound(2)<<endl; //输出3,返回第一个大于等于
cout<<*lower_bound(3)<<endl; //输出3
cout<<*upper_bound(3)<<endl; //输出4,返回第一个大于
return 0;
}