C++ STL deque 双端队列

16 篇文章 0 订阅
5 篇文章 0 订阅

STL(4) deque 双端队列

1 deque简介

双端操作:可以在队列的两端高效地进行插入和删除操作。

动态数组:内部实现为一个动态数组,支持随机访问。

分段连续存储:与 vector 不同,deque 的分段连续存储结构使得在两端插入和删除元素时效率更高。

#include <iostream>
#include <deque>

int main() {
    std::deque<int> d;
    d.push_back(1); // [1]
    d.push_front(2); // [2, 1]
    d.push_back(3); // [2, 1, 3]

    for (auto it = d.begin(); it != d.end(); ++it) {
        std::cout << *it << " ";
    }
    // 输出: 2 1 3

    d.pop_front(); // [1, 3]
    d.pop_back(); // [1]

    std::cout << "\nSize: " << d.size() << std::endl;
    // 输出: Size: 1

    return 0;
}

#include <iostream>
#include <deque>
using namespace std;

int main(){
    deque<char> myDeque;

    for(char ch='a'; ch<='z'; ++ch){
        myDeque.push_front(ch);
    }
    while (!myDeque.empty()){
        cout<<myDeque.front()<<" ";
        myDeque.pop_front();
    }

}

Container adapter 容器适配器

TL 提供了三个容器适配器:queue、priority_queue、stack。这些适配器都
是包装了 vector、list、deque 中某个顺序容器的包装器。注意:适配器没有提供迭
代器,也不能同时插入或删除多个元素。

stack

#include <iostream>
#include <stack>
using namespace std;
int main()
{
    stack<char> si;
    cout<<si.size()<<endl;
    for(int i='a'; i<='z'; i++)
    {
        si.push(i);
    }
    cout<<si.size()<<endl;
    while(!si.empty())
    {
        cout<<si.top()<<" ";
        si.pop();
    }
    cout<<endl<<si.size()<<endl;
    return 0;
}

queue

#include <iostream>
#include <queue>
using namespace std;
int main()
{
    queue<char> q;
    for(char ch='a'; ch<='z'; ch++)
    {
        q.push(ch);
    }
    while(!q.empty())
    {
        cout<<q.front()<<" ";
        q.pop();
    }
    return 0;
}

priority Queue 优先级队列

优先级队列(Priority Queue)是一种抽象数据类型,其中的元素按照优先级进行排序。

优先级高的元素先出队列。

优先级队列在许多应用中都非常有用,例如任务调度、Dijkstra算法等。

priority_queue 是一个容器适配器,默认使用 vector 作为底层容器,

并使用 less 作为比较函数,这意味着默认情况下,元素按从大到小的顺序排列(即最大的元素优先级最高)。

声明及头文件

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

#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;

// 定义一个结构体 Node,表示队列中的元素
struct Node
{
    Node(int nri, char *pszName) // 构造函数,初始化 Node 对象
    {
        priority = nri; // 初始化优先级
        strcpy(szName, pszName); // 复制名字到 szName 字符数组
    }
    char szName[20]; // 存储名字的字符数组,最多20个字符
    int priority; // 存储优先级的整数
};

// 定义一个比较类 NodeCmp,用于优先队列的比较
class NodeCmp
{
public:
    bool operator()(const Node &na, const Node &nb) // 重载()运算符,定义比较规则
    {
        if (na.priority != nb.priority) // 如果优先级不同
            return na.priority > nb.priority; // 优先级小的在前
        else
            return strcmp(na.szName, nb.szName) < 0; // 如果优先级相同,按名字字典序排序
    }
};

// 定义一个函数 PrintfNode,用于打印 Node 对象的信息
void PrintfNode(const Node &na)
{
    printf("%s %d\n", na.szName, na.priority); // 打印名字和优先级
}

int main()
{
    // 定义一个优先队列 a,使用 Node 类型,底层容器为 vector,比较器为 NodeCmp
    priority_queue<Node, vector<Node>, NodeCmp> a;

    // 向队列中添加5个元素
    a.push(Node(5, "abc"));
    a.push(Node(3, "bac"));
    a.push(Node(1, "cba"));
    a.push(Node(5, "aaa"));

    // 队头的2个元素出队并打印
    PrintfNode(a.top()); // 打印队头元素
    a.pop(); // 移除队头元素
    PrintfNode(a.top()); // 打印新的队头元素
    a.pop(); // 移除新的队头元素
    printf("--------------------\n"); // 打印分隔线

    // 再向队列中添加3个元素
    a.push(Node(2, "bbb"));
    a.push(Node(2, "ccc"));
    a.push(Node(3, "aaa"));

    // 所有元素依次出队并打印
    while (!a.empty()) // 当队列不为空时
    {
        PrintfNode(a.top()); // 打印队头元素
        a.pop(); // 移除队头元素
    }

    return 0; // 返回0,表示程序正常结束
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MarkTop1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值