c++STL系列——(十)Adapter

当提到C++ STL(标准模板库)中的适配器(Adapter),我们通常指的是stack、queue和priority_queue这三种容器适配器。它们提供了对底层容器(如vector、deque或list)的封装,使得可以使用不同的接口来操作数据结构。本文将深入探讨C++ STL中的这三种适配器,包括其基本特性、用法以及实际应用。

stack:栈适配器

基本特性

栈是一种后进先出(LIFO)的数据结构,stack适配器提供了对底层容器的封装,并且只能从容器的一端进行插入和删除操作。

基本操作

入栈与出栈
cpp 复制代码
std::stack<int> myStack;
myStack.push(1);  // 入栈
myStack.pop();    // 出栈

实际应用

括号匹配

在编译器实现中,栈广泛用于括号匹配的检查:

cpp 复制代码
bool isParenthesesValid(const std::string& s) {
    std::stack<char> myStack;
    for (char c : s) {
        if (c == '(') {
            myStack.push(c);
        } else if (c == ')') {
            if (myStack.empty() || myStack.top() != '(') {
                return false;
            } else {
                myStack.pop();
            }
        }
    }
    return myStack.empty();
}

queue:队列适配器

基本特性

队列是一种先进先出(FIFO)的数据结构,queue适配器提供了对底层容器的封装,并且只能从容器的一端进行插入,另一端进行删除操作。

基本操作

入队与出队
cpp 复制代码
std::queue<int> myQueue;
myQueue.push(1);  // 入队
myQueue.pop();    // 出队

实际应用

广度优先搜索(BFS)

在图论和树的遍历中,队列广泛用于实现BFS算法:

cpp 复制代码
void bfs(std::vector<std::vector<int>>& graph, int start) {
    std::queue<int> q;
    std::vector<bool> visited(graph.size(), false);
    q.push(start);
    visited[start] = true;
    while (!q.empty()) {
        int node = q.front();
        q.pop();
        // 处理当前节点node
        for (int neighbor : graph[node]) {
            if (!visited[neighbor]) {
                q.push(neighbor);
                visited[neighbor] = true;
            }
        }
    }
}

priority_queue:优先队列适配器

基本特性

优先队列适配器提供了对底层容器的封装,并且在插入元素时会根据一定的优先级规则进行自动排序。

基本操作

插入元素与取出顶部元素
cpp 复制代码
std::priority_queue<int> myPriorityQueue;
myPriorityQueue.push(3);  // 插入元素
int topElement = myPriorityQueue.top();  // 取出顶部元素
myPriorityQueue.pop();  // 移除顶部元素

实际应用

任务调度

在操作系统的任务调度中,优先队列广泛用于根据任务的优先级来安排执行顺序:

cpp 复制代码
struct Task {
    int priority;
    // other information
};
struct Compare {
    bool operator()(const Task& t1, const Task& t2) {
        return t1.priority < t2.priority;  // 定义优先级比较
    }
};
std::priority_queue<Task, std::vector<Task>, Compare> taskQueue;

总结

通过本文的介绍,你应该对C++ STL中的栈适配器stack、队列适配器queue和优先队列适配器priority_queue有了更加深入的了解。这三种适配器提供了方便的高层接口,使得我们能够更加轻松地操作数据结构,同时也能够应用到各种实际场景中。

相关推荐
你怎么知道我是队长13 分钟前
C语言---枚举变量
c语言·开发语言
李慕婉学姐17 分钟前
【开题答辩过程】以《基于JAVA的校园即时配送系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·开发语言·数据库
吃茄子的猫19 分钟前
quecpython中&的具体含义和使用场景
开发语言·python
云栖梦泽33 分钟前
易语言中小微企业Windows桌面端IoT监控与控制
开发语言
数据大魔方43 分钟前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
fpcc1 小时前
C++编程实践——链式调用的实践
c++
Edward.W2 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer2 小时前
Python字符串
开发语言·数据库·python
月疯2 小时前
各种信号的模拟(ECG信号、质谱图、EEG信号),方便U-net训练
开发语言·python
荒诞硬汉3 小时前
JavaBean相关补充
java·开发语言