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有了更加深入的了解。这三种适配器提供了方便的高层接口,使得我们能够更加轻松地操作数据结构,同时也能够应用到各种实际场景中。

相关推荐
IT 行者3 小时前
Web逆向工程AI工具:JSHook MCP,80+专业工具让Claude变JS逆向大师
开发语言·javascript·ecmascript·逆向
程序员 沐阳4 小时前
JavaScript 内存与引用:深究深浅拷贝、垃圾回收与 WeakMap/WeakSet
开发语言·javascript·ecmascript
Mr_Xuhhh5 小时前
Java泛型进阶:从基础到高级特性完全指南
开发语言·windows·python
He1955015 小时前
wordpress搭建块
开发语言·wordpress·古腾堡·wordpress块
老天文学家了6 小时前
蓝桥杯备战Python
开发语言·python
赫瑞6 小时前
数据结构中的排列组合 —— Java实现
java·开发语言·数据结构
初夏睡觉6 小时前
c++1.3(变量与常量,简单数学运算详解),草稿公放
开发语言·c++
升职佳兴6 小时前
C盘爆满自救:3步无损迁移应用数据到E盘(含回滚)
c语言·开发语言
ID_180079054736 小时前
除了 Python,还有哪些语言可以解析 JSON 数据?
开发语言·python·json
阿拉斯攀登7 小时前
从入门到实战:CMake 与 Android JNI/NDK 开发全解析
android·linux·c++·yolo·cmake