【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;
 } 
相关推荐
AI工程架构师1 小时前
通常说算力是多少 FLOPS,怎么理解,GPU和CPU为什么差异这么大
算法
不想写代码的星星2 小时前
C++继承、组合、聚合:选错了是屎山,选对了是神器
c++
祈安_2 小时前
Java实现循环队列、栈实现队列、队列实现栈
java·数据结构·算法
归去_来兮15 小时前
拉格朗日插值算法原理及简单示例
算法·数据分析·拉格朗日插值
千寻girling1 天前
Python 是用来做 AI 人工智能 的 , 不适合开发 Web 网站 | 《Web框架》
人工智能·后端·算法
颜酱1 天前
一步步实现字符串计算器:从「转整数」到「带括号与优化」
javascript·后端·算法
不想写代码的星星1 天前
std::function 详解:用法、原理与现代 C++ 最佳实践
c++
齐生12 天前
iOS 知识点 - 渲染机制、动画、卡顿小集合
笔记
CoovallyAIHub2 天前
语音AI Agent编排框架!Pipecat斩获10K+ Star,60+集成开箱即用,亚秒级对话延迟接近真人反应速度!
深度学习·算法·计算机视觉
木心月转码ing2 天前
Hot100-Day14-T33搜索旋转排序数组
算法