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

相关推荐
雷工笔记36 分钟前
C#知识|继承与多态
java·开发语言
吾爱星辰43 分钟前
Kotlin 类和属性(五)
java·开发语言·kotlin
吾爱星辰1 小时前
【解密 Kotlin 扩展函数】顶级函数和顶级属性(十五)
java·开发语言·jvm·kotlin
bugtraq20211 小时前
Fyne ( go跨平台GUI )中文文档-入门(一)
开发语言·后端·golang
xiaobai12 31 小时前
集群聊天服务器项目【C++】(五)网络模块和业务模块
服务器·网络·c++
GZH_mxjx1 小时前
学生管理系统1.0版本
java·开发语言
weixin_456732591 小时前
内核是如何发送数据包
linux·网络·c++
iQM752 小时前
Spring Boot 2.x基础教程:实现文件上传
java·开发语言·spring boot·后端
菜到极致就是渣2 小时前
Java如何操作Elasticsearch
java·开发语言·elasticsearch
前端李易安2 小时前
JavaScript 原型与原型链的特点,使用场景及案例
开发语言·javascript·原型模式