【STL】set容器、pair队组与map容器

目录

1.修改set容器排序规则

[2. set容器的各种函数](#2. set容器的各种函数)

3.set构造函数multiset

4.创建pair队组

5.map容器


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;
 } 
相关推荐
xiaoyalian1 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
南东山人1 小时前
一文说清:C和C++混合编程
c语言·c++
LNTON羚通2 小时前
摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现
算法·目标检测·音视频·监控·视频监控
Red Red3 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
贰十六4 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos
知兀4 小时前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
哭泣的眼泪4084 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
Ysjt | 深4 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__4 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list