STL之queue

目录

queue队列

常用的deque函数

priority_queue队列(非常重要)

priority_queue常用函数

优先队列修改比较函数的方法

1.仿函数方法

2.自定义比较函数

deque双端队列

常用的函数

例题1

题目描述

输入描述

输出描述

示例输入输出

例题2

题目描述

输入描述

输出描述

输入输出示例

输入

输出


queue队列

queue是一种先进先出(FIFO)的数据结构。

queue提供了一组函数来操作和访问元素,但它的功能相对较简单。

queue的定义和结构如下:

template<class T,class Container = deque<T>>
class queue;

T:表示存储在queue中的元素类型。

Container:表示底层容器的类型,默认为queue。也可以使用其他容器类型,如list。

queue内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

常用的deque函数

函数                        描述                        时间复杂度

push(x)            在队尾插入元素x                 O(1)

pop()                弹出队尾元素                      O(1)

front()              返回队首元素                       O(1)

back()              返回队尾元素                       O(1)

empty()            检查队列是否为空                O(1)

size()               返回队列中元素的个数         O(1)

priority_queue队列(非常重要)

priority_queue与普通队列不同,priority_queue中的元素是按照一定的优先级进行排序的。默认情况下,priority_queue按照元素的值从大到小进行排序,即最大元素位于队列的前面。

priority_queue的定义和结构如下:

template<class T,class Container = vector<T>>,
         class Compare = less<typename Container::value_type>>
class priority_queue;

T:表示存储在priority_queue中的元素类型。

Container:表示底层容器的类型,默认为vector。也可以使用其他容器类型,如deque。

Compare:表示元素之间的比较函数对象的类型,默认为less,即按照元素的值进行比较。

priority_queue的内部实现使用了底层容器来存储元素,并且只能通过特定的函数来访问和操作元素。

priority_queue常用函数

函数                        描述                                时间复杂度

push(x)            在队尾插入到优先队列中          O(logn)

pop()                弹出优先队列中的顶部元素      O(logn)

top()                返回优先队列中的顶部元素       O(1)

empty()            检查优先队列是否为空             O(1)

size()               返回优先队列中元素的个数       O(1)

优先队列是个十分重要的数据结构

优先队列修改比较函数的方法

1.仿函数方法

struct Compare
{
    bool operator()(int a,int b)
    {
        //自定义的比较函数,按照逆序排列
        return a>b;
    }
};
int main()
{
    std::priority_queue<int,std::vector<int>,Compare>pq;
}

2.自定义比较函数

auto compare = [](int a,int b)
{
    return a>b;
};
std::priority_queue<int,std::vector<int>,decltype(compare)>pq(compare);

deque双端队列

deque(双端队列)是一种容器,它允许在两端进行高效的插入和删除操作。deque是由一系列连续的存储块(缓冲区)组成的,每个存储块都存储了多个元素。这使得deque能够在两端进行快速的插入和删除操作,而不需要移动其他元素。

常用的函数

函数                                描述                                时间复杂度

push_back(x)            在尾部插入元素x                 平摊O(1)

push_front(x)             在头部插入元素x                 平摊O(1)

pop_front()                 弹出头部元素                       O(1)

pop_back()                 弹出尾部元素                       O(1)

front()                         返回头部元素                       O(1)

back()                         返回尾部元素                       O(1)

empty()            检查deque是否为空                        O(1)

size()               返回deque中元素的个数                 O(1)

clear()            清空deque中的所有元素                   O(1)

例题1

题目描述

ZZB银行有两个窗口,VIP窗口和普通窗口,VIP用户进入VIP窗口排队,剩下的进入普通窗口排队。现有M次操作,操作有四种类型如下:

IN name v:表示一名叫name的用户到VIP窗口排队

OUT v:表示VIP窗口队头的用户离开排队

IN name N:表明一名叫name的用户到普通窗口排队

OUT N:表明普通窗口队头的用户离开排队

求M次操作后VIP窗口队列和普通队列中的姓名

输入描述

第一行是一个整数M(1<=M<=1000),表示一共有M次操作,

第二行到第M+1行输入操作格式如下:

IN name v

OUT v

IN name N

OUT N

输出描述

输出M次操作后VIP窗口队列和普通队列中的姓名(从头到尾),先输出VIP窗口队列后输出普通窗口队列。

示例输入输出

输入:

5
IN xiaoming N
IN adel V
IN LAOZHAO N
OUT N
IN CLZ V

输出:

adel
CLZ
LAOZHAO

#include<iostream>
#include<string>
#include<queue>
using namespace std;


int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int m; cin >> m;
	queue<string>V, N;
	while (m--)
	{
		string op; cin >> op;
		if (op == "IN")
		{
			string name,q; cin >> name>>q;
			if (q == "V")
			{
				V.push(name);
			}
			else
			{
				N.push(name);
			}
		}
		else
		{
			string q; cin >> q;
			if (q == "V")
			{
				V.pop();
			}
			else
			{
				N.pop();
			}
		}
	}
	while (V.size())
	{
		cout << V.front() << endl;
		V.pop();
	}

	while (N.size())
	{
		cout << N.front() << endl;
		N.pop();
	}

	return 0;
}

例题2

题目描述

在一个果园里,多多已经将所有的果子打下来了,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

每一次合并,多多可以把两堆果子合到一起,消耗的体力等于两堆果子重量之和。可以看出,所有的果子经过n-1次合并之后,就剩下一堆了,多多在合并果子是总共消耗的体力等于每次合并消耗体力之和。

设计合并次序方案,获取体力消耗最小值。

输入描述

输入两行

第一行是一个整数n(1<=n<=10^4),表示果子的种类数。

第二行包含n个整数,表示每种果子的数量。

输出描述

输出一个整数,体力最小值,输入数据保证这个值小于2^33.

输入输出示例

输入

3

1 2 9

输出

15

#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
using LL = long long;

int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int n; cin >> n;
	priority_queue<LL, vector<LL>,greater<LL>> pq;
	for (int i = 1; i <= n; i++)
	{
		LL x; cin >> x;
		pq.push(x);
	}
	LL ans = 0;
	while (pq.size() >= 2)
	{
		LL x = pq.top(); pq.pop();
		LL y = pq.top(); pq.pop();

		ans += x + y;
		pq.push(x + y);
	}
	cout << ans << endl;

	return 0;
}

引用中的代码展示了使用STL库中的queue容器的示例。queue是一种先进先出(FIFO)的数据结构,它允许在队尾插入元素,在队首删除元素。在这个示例中,首先创建了一个CData的对象test1,并将其加入到了dataQueue中,然后通过front()函数获取dataQueue的队首元素并赋值给data对象,最后通过pop()函数将队首元素从dataQueue中弹出。 引用说明了queue的底层实现类型,默认为std::deque,但也可以是其他类型,只要支持相应的操作,如front、back、push_back和pop_front等。 引用列举了queue常用的成员函数和功能。其中,empty()函数用于判断queue是否为空,size()函数用于返回queue中元素的个数,front()函数返回queue的第一个元素的引用,back()函数返回queue的最后一个元素的引用,push()函数用于在queue的尾部添加一个元素的副本,emplace()函数用于在queue的尾部直接添加一个元素,push(T&& obj)函数以移动的方式在queue的尾部添加元素,pop()函数用于删除queue中的第一个元素,swap()函数用于交换两个queue容器的元素。 综上所述,引用的代码示例展示了使用STL库中的queue容器的基本操作,包括插入、删除和访问元素的方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [c++ stl queue的使用](https://blog.csdn.net/tianyexing2008/article/details/126356034)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [C++STLqueue的简单使用](https://blog.csdn.net/lady_killer9/article/details/79261798)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是祁同伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值