一、定义
set 集合容器相当与实现了二叉排序树,在插入元素的时候,它会自动的调整二叉树的排列,把该元素放到适当的位置,以确保每个子树上面得到根节点的键值大于左子树所有节点的键值,小于右子树的所有节点的键值。另外还要同时确定根节点的左子树的高度与右子树的高度相等,这样来说,二叉树的高度最小,从而检索速度最快。同样的它不会插入重复的键值。将元素自动排序
二、目的
使用set的目的就是为了快速的检索数据,如果修改了其中一个键值的话,就会导致整个子树的改变。
三、用法
set<type>Name ;//定义了一个元素类型为type ,变量名称为Name 的set容器
Name.insert(1);//向Name容器中插入数值为1
s.erase(6);//删除键值为6的元素
s.clear();//对应s的清空
s.size();//返回s的大小
s.find(1);//寻找键值为1的位置(迭代器)
s.empty();//判断s是否为空
lower_ bound(keyelem);//返回第一个key<=keyelem元素的迭代器
upper_bound(keyelem);//返回第一个key>keyelem元素的迭代器
equal_range(keyelem);//返回容器中key与keyelem相等的上下限的俩个迭代器
四、代码实现
#include<set>
#include<iostream>
#include<cstring>
using namespace std;
int main(int argc,char *argv[])
{
set<int >s;//定义了一个set 对象
s.insert(1);//插入元素
s.insert(10);
s.insert(23);
s.insert(45);
s.insert(50);
s.insert(12);
s.insert(24);
set<int>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" "<<endl;
set<int>::reverse_iterator rit;
//定义了反向迭代器
cout<<"这是反向迭代的结果"<<endl;
for(rit=s.rbegin();rit!=s.rend();rit++)
cout<<*rit<<" "<<endl;
s.erase(1);
cout<<"这是删除1的结果"<<endl;
for(it=s.begin();it!=s.end();it++)
cout<<*it<<" "<<endl;
set<int>::iterator findindex;
findindex=s.find(50);
if(findindex!=s.end())
cout<<"所要寻找的数为"<<*findindex<<" "<<endl;
else
cout<<"没找到"<<endl;
}
自定义比较函数(按照一定的顺序插入元素)
#include<iostream>
#include<cmath>
#include<string>
#include<set>
using namespace std;
//自定义比较函数,所以重载了()的操作符!!!!!!!
struct myComp
{
bool operator()(const int &a,const int &b)
{
if(a!=b)
return a>b;
else
return a>b;
}
};
int main(int argc,char *argv[])
{ set<int,myComp> s;
s.insert(23);
s.insert(12);
s.insert(78);
s.insert(212);
set<int,myComp>::iterator it;
//定义的向前的迭代器
for(it=s.begin();it!=s.end();it++)
{
cout<<*it<<" "<<endl;
}
return 0;
}
执行结果:
顺序添加结构体元素
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
struct Data//定义了一个结构体
{
string name;
float score;
bool operator <(const Data &a)const
{ return a.score<score;
}
};
int main(int argc,char *argv[])
{
set<Data>s;
Data data;
data.name="121";
data.score=100;
s.insert(data);
data.name="adas";
data.score=11;
s.insert(data);
data.name="qweq";
data.score=23;
s.insert(data);
set<Data>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).name<<" :"<<(*it).score<<endl;
return 0;
}
执行结果:
multiset允许重复元素的键值插入