【C++标准模板库】队列、栈和pair常见用法

一、queue

队列,先进先出

#include <queue>
queue<typename> name;

限制性数据结构,只能通过front()来访问队首元素,back()来访问队尾元素,时间复杂度为O(1)

void queueTest() {
	queue<int>  q;
	for (int i = 1;i <= 5;i++) {
		q.push(i);
	}
	if (q.empty() != true) {
		cout << "队首元素:" << q.front() << endl;
		cout << "队尾元素:" << q.back() << endl;
		cout << "st的元素个数:" << q.size() << endl;
	}
	//栈顶元素出栈
	for (int i = 1;i < 3;i++) {
		q.pop();
	}
	
	cout << "出队一些元素后的队首元素:" << q.front() << endl;
	cout << "出队一些元素后的队尾元素:" << q.back() << endl;
	cout << "出队一些元素后的的元素个数:" << q.size() << endl;
}

在这里插入图片描述

常见用途:
1、广度优先搜索
2、在使用front()和pop()前,必须用empty()判断队列是否为空
3、另外两种跟队列有关的容器:双端队列(deque),首尾皆可插入和删除的队列;优先队列(priority_queue),使用堆实现的默认将当前队列最大元素制语队首的容器。

二、priority_queue

优先队列,底层用堆来实现。队首元素一定是当前队列中优先级最高的一个。

#include<queue>
priority_queue<typename> name;

没有front()和back(),只能通过top()来访问队首元素(堆顶元素),也是优先级最高的元素。

(一)元素优先级的设置

1、基本数据类型(用int型举例)

(1)元素越大优先级越高:priority_queue<int> q;
也可以写成priority_queue<int,vector<int>,less<int> > q;
**vector< int>**是填写用来承载1底层数据结构堆(heap)的内容。
less是对第一个参数的比较类,表示元素越大优先级越大;greater表示元素越小优先级越大。

priority_queue<int, vector<int>, less<int> > q;
	q.push(10);
	q.push(3);
	q.push(5);
	q.push(12);
	cout << "基本结构队首元素:" << q.top() << endl;
	q.pop();
	cout <<"使用pop()后的基本结构:" << q.top() << endl;

在这里插入图片描述

2、结构体

内含的结构体、重载和友元的概念不在此描述
和基本数据类型差不多,有两种定义方式

//按水果的价格,价格越小优先级越高
struct fruit
{
	string name;
	int price;
	//重载<符号,使价格高的优先级高
	/*friend bool operator < (fruit f1, fruit f2) {
		return f1.price > f2.price;
	}*/
}f1,f2,f3;
struct cmp {
	bool operator() (fruit f1, fruit f2) {
		return f1.price > f2.price;
	}
};
void priority_queueTest() {
	//priority_queue<fruit> f;
	priority_queue<fruit,vector<fruit>,cmp> f;
	f1.name = "桃子";
	f1.price = 10;
	f2.name = "苹果";
	f2.price = 8;
	f3.name = "荔枝";
	f3.price = 20;
	f.push(f1);
	f.push(f2);
	f.push(f3);
	cout <<"结构体:" << f.top().name<<"\t"<< f.top().price<< endl;
}

注:1、如果结构体内的数据较为庞大,可以使用引用提高效率,参数中加上“const”或“&”

friend bool operator < (const fruit &f1, const fruit &f2) {
		return f1.price > f2.price;
	}
bool operator() (const fruit &f1, const fruit &f2) {
		return f1.price > f2.price;
	}

2、在使用top()前,必须用empty()判断队列是否为空

三、stack

栈,后进先出
只能通过top()来访问栈顶元素

定义和访问

1、定义:stack<typename> name;

void stackTest() {
	stack<int>  st;
	for (int i = 1;i <= 5;i++) {
		st.push(i);
	}
	if (st.empty() != true) {
		cout << "st的栈顶元素:"<<st.top() << endl;
		cout << "st的元素个数:" << st.size() << endl;
	}
	//栈顶元素出栈
	st.pop();
	cout << "st出栈后的栈顶元素:" << st.top() << endl;
	cout << "st出栈后的元素个数:" << st.size() << endl;
}

在这里插入图片描述
常用来模拟实现一些递归,防止程序对栈内存的限制而导致程序运行出错。

四、pair

当想要将两个元素绑在一起作为一个合成元素,又不想因此定义一个结构体是,可以用pair当一个替代品
使用头文件#include <utility>,map头文件时会自动添加utility头文件,所以可以用map头文件代替utility头文件

定义

pair<typeName1,typeName2> name;

typeName1,typeName2分别对应first和second的数据类型,可以是任意基本数据类型和容器。
有几种写法:
(1)进行初始化:pair<string,int> p("haha",5);
(2)在代码中临时构建一个pair:
将类型定义写在前面,后面用小括号内两个元素的方式:pair<string,int>("haha",5);
使用自带的make_pair函数:make_pair(“haha”,5)

访问

正常结构体的方式访问

void pairTest() {
	pair<string, int> p;
	p.first = "haha";
	p.second = 5;
	cout << p.first << "\t" << p.second << endl;
	p = make_pair("xixi", 5);
	cout << p.first << "\t" << p.second << endl;
	p = pair<string, int>("heihei", 55);
	cout << p.first << "\t" << p.second << endl;
}

在这里插入图片描述

常用函数

1、比较操作数
可以直接用==、!=、<、<=、> 、>=
比较规则:先以first的大小作为标准,只有当first相等时采取判别second的大小。

	pair<int, int> p1(5, 10);
	pair<int, int> p2(5, 20);
	pair<int, int> p3(10, 10);
	if (p1 < p3) cout << "p1<p3" << endl;
	if (p1 <= p3) cout << "p1<=p3" << endl;
	if (p1 < p2) cout << "p1<p2" << endl;

在这里插入图片描述
常见用途:
1、用来代替二元结构体及其构造函数,节省编码时间
2、作为map的键值对进行插入

map<string, int> mp;
	mp.insert(make_pair("heihei", 55));
	mp.insert(pair<string, int>("haha", 10));
	for (map<string, int>::iterator it = mp.begin();it != mp.end();it++) {
		cout << it->first << "\t" << it->second << endl;
	}

在这里插入图片描述

注:前面队列和栈示例中用到的函数解释:
1、push()、pop()
push():进入队列
pop():首元素出队
2、empty()
检测是否为空,返回true为空,false为非空
3、size()
返回queue内元素个数(通用)

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值