c++ vector 先进先出_C++ 学习笔记之——STL 库 queue

本文介绍了C++中的队列容器适配器,包括如何使用`empty()`、`size()`、`back()`、`front()`、`push()`和`pop()`等方法。同时讲解了优先级队列的工作原理,它始终保持最高优先级元素在顶部,并提供了`top()`、`push()`和`pop()`等操作。通过示例展示了如何利用优先级队列将两个降序的vector合并为一个新的降序vector。
摘要由CSDN通过智能技术生成

1. 队列

queue 队列是一种容器适配器,专门用来满足先进先出的操作,也就是元素在容器的一端插入并从另一端提取。

bool empty() const; 返回队列是否为空;

size_type size() const; 返回队列中元素的数量;

reference& back(); 返回队列中最后一个元素也即最新的元素的引用;

reference& front(); 返回队列中的下一个元素也即最旧的元素的引用;

void push (const value_type& val); 在队尾插入一个元素;

void pop(); 弹出队列的下一个元素也即最旧的元素,队头元素。

2. 优先级队列

优先级队列是一种容器适配器,根据一些严格的弱排序标准,专门设计使其第一个元素始终是它包含的最值元素。其本质上就是一个大顶堆或者小顶堆,会在需要时自动调用函数 make_heap,push_heap 和 pop_heap 自动完成堆化,比如插入新元素或者弹出堆顶元素。

bool empty() const; 返回优先级队列是否为空;

size_type size() const; 返回优先级队列中元素的数量;

const_reference top() const; 返回优先级队列的顶部元素,也即比较优先级最高的元素;

void push (const value_type& val); 在优先级队列中插入一个元素;

void pop(); 弹出优先级队列的顶部元素。

下面的例子中展示了构建优先级队列,将两个降序的 vector 合并成一个新的降序的 vector。

#include

#include

#include

using namespace std;

class mycomparison

{

bool big_heap; // 大顶堆标志位,也就是所有元素比堆顶元素小

public:

mycomparison(const bool& param=true)

{big_heap = param;}

bool operator() (const vector vec1, const vector vec2) const

{

if (big_heap) return (vec1[0] < vec2[0]);

else return (vec1[0] > vec2[0]);

}

};

int main ()

{

vector vec1;

vec1.push_back(200);

vec1.push_back(50);

vec1.push_back(32);

vector vec2;

vec2.push_back(100);

vec2.push_back(96);

vec2.push_back(20);

vector vec3;

// priority_queue, vector< vector>, mycomparison> q(mycomparison(false));

// priority_queue, vector< vector>, mycomparison> q(false);

priority_queue, vector< vector>, mycomparison> q;

q.push(vec1);

q.push(vec2);

while (!q.empty())

{

vector temp = q.top();

q.pop();

vec3.push_back(temp[0]);

temp.erase(temp.begin());

if (temp.size() != 0) q.push(temp);

}

for (vector::iterator it = vec3.begin(); it != vec3.end(); it++) cout << *it << ' ';

return 0;

}

获取更多精彩,请关注「seniusen」!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值