STL-Set
1.insert
set<int> s;
s.insert(1);
s.insert(5);
s.insert(-5);
s.insert(1);//重复元素不会被多次插入
2.find
返回某个要查找元素的迭代器,如果元素不存在,则返回集合最后一个元素后面的一个位置,即end()。
set<int>::iterator it;
it = s.find(5);
if(it != s.end())
cout<< *it <<endl;
else
cout<<"Not find it" << endl;
//如果元素存在也可以直接写成这样
cout<<*(s.find(5))<<endl;
3.迭代器
当需要遍历集合元素时,需要使用迭代器。
set<int>::iterator it;
for(it = s.begin();it != s.end();it++)
cout<<*it<<" ";
cout<<endl;
注意:不支持 it < s.end() 的写法
当需要反向遍历集合时,可以使用反向迭代器reverse_iterator,输出的结果正好是集合元素的反向排序结果。它需要用到rbegin()和rend()两个方法,它们分别给出了反向遍历的开始位置和结束位置。
set<int>::reverse_iterator rit;
for(rit = s.rbegin();rit != s.rend();rit++)
cout<<*rit<<" ";
cout<<endl;
4.count
返回元素在集合中出现的次数,由于 set 不会存在重复元素,所以 count() 函数的返回值为 1 或 0,该方法也可以用来判断在集合中是否存在某个元素。
set<int> s;
s.insert(1);
s.insert(5);
s.insert(-5);
s.insert(1);
if(s.count(-45))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
5.自定义比较函数
使用insert将元素插入到集合中去的时候,集合会根据设定的比较函数奖该元素放到该放的节点上去。在定义集合的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值从小到大的顺序插入元素。但在很多情况下,需要自己编写比较函数。
- 如果元素不是结构体,那么可以编写比较函数。下面的程序比较规则为按键值从大到小的顺序插入到集合中。
#include <iostream>
#include <set>
using namespace std;
struct cmp{
bool operator() (const int &a,const int &b){
return a > b;
}
};
int main(void){
set<int,cmp>s;
s.insert(5);
s.insert(1);
s.insert(6);
s.insert(3);
s.insert(5);
set<int,cmp>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout << *it << " ";
cout << endl;
return 0;
}
/*
运行结果:6 5 3 1
*/
- 如果元素是结构体,那么可以直接把比较函数写在结构体内
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
struct node{
int data;
node(){}
node(int d):data(d){}
bool operator < (const node &n) const{// 重载“<”操作符,自定义排序规则
//按 data 由大到小排序。如果要由小到大排序,使用“>”即可。
return n.data < data;
}
};
int main(void){
set<node> s;
s.insert(node(5));
s.insert(node(1));
s.insert(node(6));
s.insert(node(3));
s.insert(node(5));
set<node>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout << (*it).data << " ";
cout << endl;
return 0;
}
/*
运行结果:6 5 3 1
*/
也可以把结构体和比较函数分开写,然后一起构建 set,像下面一样,效果和上面相同。
#include <iostream>
#include <set>
using namespace std;
struct node{
int data;
node(){}
node(int d):data(d){}
};
struct cmp1{
bool operator() (const node &n1,const node &n2){
return n1.data > n2.data;
}
};
int main(void){
set<node,cmp1> s;
s.insert(node(5));
s.insert(node(1));
s.insert(node(6));
s.insert(node(3));
s.insert(node(5));
set<node,cmp1>::iterator it;
for(it = s.begin(); it != s.end(); it++)
cout << (*it).data << " ";
cout << endl;
return 0;
}