目录
[2. set容器的各种函数](#2. set容器的各种函数)
1.修改set容器排序规则
set容器会自动以升序的方式进行排序,想要改变可以制定排序规则,set<int,排序规则> s;
但需要注意,在尖括号里面必须是类型,所以可以创建一个类,在类里面来实现我们的排序
cpp
#include<iostream>
#include<set>//头文件
using namespace std;
void printset(set<int> &s)
{
set<int>::iterator it=s.begin();
for( ;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
class myrule
{
public:
bool operator()(int v,int v2)
{
return v>v2;
}
};
void printmyrule(set<int,myrule> &m)
{
set<int,myrule>::iterator it=m.begin();
for( ;it!=m.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
set<int> s;//自动以升序排
s.insert(10);
s.insert(30);
s.insert(20);
s.insert(50);
s.insert(60);
s.insert(40);
printset(s);
//set<int,排序规则>
set<int,myrule> m;//myrule改变排序方式
m.insert(10);
m.insert(30);
m.insert(20);
m.insert(50);
m.insert(60);
m.insert(40);
printmyrule(m);
return 0;
}
2. set容器的各种函数
- find(x)函数若查找到返回的是该值的迭代器,若不存在,返回set.end();
- lower_bound(x) //下限,返回的是第一个key>=m元素的迭代器
- upper_bound(x) //上限,返回的是第一个key>m的迭代器
- equal_range(x) //返回x上下限的两个迭代器,所以只能用队组pair的方式来存储上下限
注意:set只有一个键值,也就是说不能有存入两个相同的数据,不然只会输出一个
cpp
#include<iostream>
#include<set>//头文件
using namespace std;
void printset(set<int> &s)
{
set<int>::iterator it=s.begin();
for( ;it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
int main()
{
set<int> s;//自动以升序排
s.insert(10);
s.insert(30);
s.insert(20);
s.insert(50);
s.insert(60);
s.insert(40);
printset(s);
set<int>::iterator ret;
ret=s.find(50);//因为find()返回的为迭代器,所以要用迭代器来装
if(ret!=s.end())
{
cout<<"找到结果:"<<*ret;
}
cout<<endl;
set<int>::iterator it;
it=s.lower_bound(50);
if(it!=s.end())
{
cout<<"下限为:"<<*it<<endl;
}
set<int>::iterator its;
its=s.upper_bound(50);
if(its!=s.end())
{
cout<<"上限为:"<<*its<<endl;
}
//pair<第一个值类型,第二个值类型> 返回两个值
//以队组的方式储存上下限
pair<set<int>::iterator,set<int>::iterator> pa;//上下限是以迭代器的方式返回
pa=s.equal_range(50);
if(pa.first!=s.end())
{
cout<<"下限为:"<<(*pa.first)<<endl;
}
if(pa.second!=s.end())
{
cout<<"下限为:"<<(*pa.second)<<endl;
}
return 0;
}
3.set构造函数multiset
- multiset与set最大的区别在于set不可以有两个相同的值,但multiset可以有相同的数值
- multiset的头文件依旧为#include<set>
- 如果有两个相同的值在set里,只会输出一个
4.创建pair队组
- pair的头文件可以是STL容器中的任意一个,如:vector、deque、stack、list、set、map,但string除外
5.map容器
- map返回的有两个,键值k和实值,所以我们使用pair队组来接收map容器的返回值
- map与set相同,只能有一个k值,不能有重复的,但multimap可以
cpp
#include<iostream>
#include<map>
#include<string>
using namespace std;
class student
{
friend void printmap(map<int,student> &m);
private:
int num;
string name;
float score;
public:
student(){
}
student(int num,string name,float score)
{
this->num=num;
this->name=name;
this->score=score;
}
};
void printmap(map<int,student> &m)
{
map<int,student>::iterator it=m.begin();
for( ;it!=m.end();it++){
cout<<(*it).first<<" "<<(*it).second.name<<" "<<(*it).second.score<<endl;
}
}
int main()
{
map<int,student> m;
//方法一:
m.insert(pair<int,student>(2000,student(2000,"chen",89.2f)));
//方法二:(推荐)
m.insert(make_pair(2001,student(2001,"zhang",68.2f)));
//方法三:(危险)使用这个方法要确保m括号里面的k值存在
m[2002]=student(2002,"tian",98.2f);
printmap(m);
return 0;
}