构造set集合的目的:快速检索
元素的插入和中序遍历:采用insert(),插入规则在默认规则下,按元素值由小到大插入;
如果指定规则函数,按自定义函数插入。
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main()
{
set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
s.insert(8);
s.insert(1);
s.insert(6);
s.insert(12);
s.insert(8);//重复元素,不会插入
set<int>::iterator it;//定义前向迭代器
for(it=s.begin();it!=s.end();it++)//中序遍历集合的所有元素
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
元素反向遍历:使用反向迭代器reserve_iterator,输出结果正好是集合元素反向排序结果。它需要
用到rbegin()和rend()。
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main()
{
set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
s.insert(8);
s.insert(1);
s.insert(6);
s.insert(12);
s.insert(8);//重复元素,不会插入
set<int>::reverse_iterator rit;//定义反向迭代器
for(rit=s.rbegin();rit!=s.rend();rit++)
{
cout<<*rit<<" ";
}
cout<<endl;
return 0;
}
元素删除:
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main()
{
set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
s.insert(8);
s.insert(1);
s.insert(6);
s.insert(12);
s.insert(8);//重复元素,不会插入
s.erase(6);//删除键值为6的元素
set<int>::reverse_iterator rit;//定义反向迭代器
for(rit=s.rbegin();rit!=s.rend();rit++)
{
cout<<*rit<<" ";
}
cout<<endl;
s.clear();//清空集合
cout<<s.size()<<endl;
return 0;
}
元素的检索:使用find()对集合进行搜素,如果找到,返回该键值的迭代器位置,否则,返回
集合最后一个元素后面的一个位置(下标),即end()。
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main()
{
set<int> s;//定义元素类型为int的集合对象,当前没有任何元素
s.insert(8);
s.insert(1);
s.insert(6);
s.insert(12);
s.insert(8);//重复元素,不会插入
set<int>::iterator it;//定义前向迭代器
it=s.find(6);//查找键值为6的元素
if(it!=s.end())
{
cout<<*it<<endl;
}
else
cout<<"not find it"<<endl;
it=s.find(20);
if(it!=s.end())
{
cout<<*it<<endl;
}
else
cout<<"not find it"<<endl;
it=s.find(30);
cout<<*it<<endl;
return 0;
}
自定义比较函数
(1)
#include <iostream>
#include <set>
#include <stdio.h>
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;//定义元素类型为int的集合对象,当前没有任何元素
s.insert(8);
s.insert(1);
s.insert(6);
s.insert(12);
s.insert(8);//重复元素,不会插入
set<int,myComp>::iterator it;//定义前向迭代器
for(it=s.begin();it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
return 0;
}
(2)如果元素是结构体
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
struct Info
{
string name;
float score;
bool operator <(const Info &a) const
{
return a.score<score;//从大到小
}
};
int main(int argc,char*argv[])
{
set<Info> s;//定义元素类型为int的集合对象,当前没有任何元素
Info info;
info.name="Jack";
info.score=80.5;
s.insert(info);
info.name="Tomi";
info.score=20.5;
s.insert(info);
info.name="Nacy";
info.score=60.5;
s.insert(info);
set<Info>::iterator it;//定义前向迭代器
for(it=s.begin();it!=s.end();it++)
{
cout<<(*it).name<<" : "<<(*it).score<<endl;
}
return 0;
}