首页 > 其他分享 >基于STL的自定义栈与队列实现:灵活选择底层容器的模板设计

基于STL的自定义栈与队列实现:灵活选择底层容器的模板设计

时间:2024-10-30 20:44:43浏览次数:10  
标签:std 容器 const 自定义 STL queue push stack 模板

文章目录


前言:

在本文中,我们将分析一个模拟C++标准模板库(STL)栈的自定义实现以及模仿C++标准模板库(STL)队列的自定义实现。该stack类模板允许在底层容器的选择上具有灵活性、该queue类模板采用灵活的容器选择机制,默认使用std::deque作为底层容器,这与STL设计相似。接下来,我们将深入研究代码的结构、功能,以及使用模板和容器组合在C++中实现的优势。

代码

这是在Stack命名空间下的主要类定义:

namespace Stack
{
    template<class T, class Container>
    class stack
    {
    public:
        void push(const T& x) { _con.push_back(x); }
        void pop() { _con.pop_back(); }
        const T& top() const { return _con.back(); }
        size_t size() const { return _con.size(); }
        bool empty() const { return _con.empty(); }
    
    private:
        Container _con;
    };
}

模板设计

该类是一个模板,接受两个参数:
T:存储在栈中的元素类型。
Container:底层容器类型,用于管理栈元素的存储。
这种设计使我们能够自定义底层的存储容器,允许使用std::vector、std::list或std::deque作为底层数据结构。在标准库中,std::stack默认使用std::deque作为底层容器,因为它在两端插入和移除元素时的效率较高。

主要成员函数

让我们逐一了解主要的成员函数:

push(const T& x):用于将一个元素x压入栈顶。此实现使用了push_back函数,因为无论使用哪种容器,我们都希望在容器末尾添加新元素。

pop():用于移除栈顶元素。与push类似,此处使用pop_back,因为需要从容器的末尾移除元素。

top() const:返回栈顶元素的常量引用。这是只读访问,因为栈顶元素不能通过top()修改。

size() const:返回栈中的元素数量,直接调用容器的size()函数。

empty() const:用于检查栈是否为空,直接调用容器的empty()函数。

底层容器的选择

在这个实现中,底层容器的选择灵活。例如:
std::vector:可以用于存储连续内存中的栈,但当栈中的元素较多时,可能会带来内存的重新分配开销。
std::list:是链式存储结构,不支持随机访问,但在频繁插入和删除操作时性能较优。
std::deque:是双端队列,既支持随机访问,又可以在两端进行高效的插入和删除操作,是STL中std::stack的默认容器。
小结
该stack模板类通过组合不同的容器类型实现了灵活的栈结构,符合STL设计原则。在实际使用中,根据需求选择合适的底层容器,可以进一步优化栈的性能。

这是在Queue命名空间下的queue类定义:

namespace Queue
{
    template<class T, class Container = std::deque<T>>
    class queue
    {
    public:
        void push(const T& x) { _con.push_back(x); }
        void pop() { _con.pop_front(); }
        const T& front() const { return _con.front(); }
        const T& back() const { return _con.back(); }
        size_t size() const { return _con.size(); }
        bool empty() const { return _con.empty(); }
    
    private:
        Container _con;
    };
}

模板设计

该类是一个模板,接受两个参数:
T:存储在队列中的元素类型。
Container:底层容器类型,用于存储队列元素,默认使用std::deque。
这种设计允许我们在实现队列时选择不同的容器,如std::deque、std::vector或std::list。然而,std::deque是STL中默认的底层容器,因其支持在两端快速插入和删除元素,非常适合队列的FIFO(First In, First Out)特性。

主要成员函数解析
以下是queue类中的核心成员函数:

void push(const T& x)
push函数将元素x添加到队列末尾。此函数调用_con.push_back(x),无论底层容器是什么类型,都确保新元素添加到队列的“尾部”。

void pop()
pop函数移除队列的第一个元素。它调用_con.pop_front(),遵循队列的FIFO特性,将队首元素出队。这种操作在std::deque和std::list中效率较高,而在std::vector中效率相对较低。

const T& front() const
front函数返回队列首元素的常量引用。由于是常量引用,用户可以读取但不能修改队首元素。

const T& back() const
back函数返回队列尾元素的常量引用。用户可以读取队列中的最后一个元素,但不能通过此方法修改它。

size_t size() const
size函数返回队列中元素的数量,直接调用底层容器的size()函数。

bool empty() const
empty函数检查队列是否为空,直接调用底层容器的empty()函数。

底层容器的选择

在该实现中,可以选择不同的容器作为底层数据结构,以下是常见的选择及其特点:
std::deque:STL中std::queue的默认容器。支持两端快速插入和删除,非常适合队列的特性。
std::list:链表结构,允许在两端常数时间内插入和删除元素,适用于需要频繁插入和删除的场景。
std::vector:虽然可以作为底层容器,但由于在队首插入和删除元素效率较低,通常不推荐在队列中使用。

关于stack的示例代码

#include "stack.h"
#include <vector>
#include <list>
#include <iostream>

int main() {
    // 使用 std::vector 作为底层容器的栈
    bit::stack<int, std::vector<int>> vector_stack;
    vector_stack.push(10);
    vector_stack.push(20);
    vector_stack.push(30);
    vector_stack.pop();  // 移除栈顶元素
    std::cout << "Top element in vector-based stack: " << vector_stack.top() << std::endl;  // 输出栈顶元素
    std::cout << "Stack size: " << vector_stack.size() << std::endl;  // 输出栈的大小

    // 使用 std::list 作为底层容器的栈
    bit::stack<int, std::list<int>> list_stack;
    list_stack.push(40);
    list_stack.push(50);
    list_stack.push(60);
    list_stack.pop();  // 移除栈顶元素
    std::cout << "Top element in list-based stack: " << list_stack.top() << std::endl;  // 输出栈顶元素
    std::cout << "Stack size: " << list_stack.size() << std::endl;  // 输出栈的大小

    return 0;
}

关于queue的示例代码

#include "queue.h"
#include <deque>
#include <list>
#include <vector>
#include <iostream>

int main() {
    bit::queue<int, std::deque<int>> deque_queue;
    deque_queue.push(10);
    deque_queue.push(20);
    deque_queue.push(30);
    deque_queue.pop();
    std::cout << "Front element in deque-based queue: " << deque_queue.front() << std::endl;

    bit::queue<int, std::list<int>> list_queue;
    list_queue.push(40);
    list_queue.push(50);
    list_queue.push(60);
    list_queue.pop();
    std::cout << "Front element in list-based queue: " << list_queue.front() << std::endl;

    return 0;
}

标签:std,容器,const,自定义,STL,queue,push,stack,模板
From: https://blog.csdn.net/ZWW_zhangww/article/details/143345565

相关文章

  • 详解:模板设计模式
            模板设计模式(TemplatePattern)是一种行为设计模式,在软件设计中有着广泛的应用,旨在提高代码的可维护性和可复用性。一、定义与特点定义:模板设计模式定义了一个算法的骨架,将某些步骤推迟到子类中实现。这样,可以在不改变算法结构的情况下,重新定义算法中的某些......
  • OpenCV与AI深度学习 | 实战 | YOLO11自定义数据集训练实现缺陷检测 (标注+训练+预测
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:实战|YOLO11自定义数据集训练实现缺陷检测(标注+训练+预测保姆级教程)导 读   本文将手把手教你用YOLO11训练自己的数据集并实现缺陷检测。安装环境YOLO11的介绍和使用这里不再赘......
  • Windows Server 2022 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2022OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2022-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现......
  • Windows Server 2019 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2019OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2019-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWin......
  • Windows Server 2016 OVF, updated Oct 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2016OVF,updatedOct2024(sysin)-VMware虚拟机模板2024年10月版本更新,现在自动运行sysprep,支持ESXiHostClient部署请访问原文链接:https://sysin.org/blog/windows-server-2016-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.org现......
  • Windows Server 2008 R2 OVF, updated Aug 2024 (sysin) - VMware 虚拟机模板
    WindowsServer2008R2OVF,updatedAug2024(sysin)-VMware虚拟机模板WindowsServer2008R2简体中文版OVF,2024年10月更新请访问原文链接:https://sysin.org/blog/windows-server-2008-r2-ovf/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgWindows......
  • nw.js的nw.Menu()自定义菜单
    nw.js是一个基于Chromium和Node.js的开源框架,它允许开发者使用HTML5、CSS3和JavaScript来创建桌面应用程序。在nw.js中,nw.Menu是一个用于创建自定义菜单栏的类,它允许开发者将自定义菜单项添加到应用程序的菜单栏中。以下是nw.Menu的主要特性和用法:特性自......
  • PbootCMS 模板提示未检测到您服务器环境的sqlite3数据库扩展
    错误信息:未检测到您服务器环境的sqlite3数据库扩展,请检查php.ini中是否已经开启该扩展!另外,检测到您服务器支持pdo_sqlite扩展,您也可以修改数据库配置连接驱动为pdo_sqlite试试!解决方法:1.**第一种方法**:把数据库配置连接驱动改为pdo_sqlite-打开数据库配置文件`/apps/co......
  • 帝国CMS中打印模板制作教程详解
    调用打印页面链接:模板中添加打印页面链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]指定使用打印模板的链接:[!--news.url--]e/DoPrint/?classid=[!--classid--]&id=[!--id--]&tempid=打印模板ID管理打印模板:登录后台,选择“模板......
  • HarmonyOS:自定义组件冻结功能
    一、简介自定义组件冻结功能专为优化复杂UI页面的性能而设计,尤其适用于包含多个页面栈、长列表或宫格布局的场景。在这些情况下,当状态变量绑定了多个UI组件,其变化可能触发大量UI组件的刷新,进而导致界面卡顿和响应延迟。为了提升这类负载UI界面的刷新性能,开发者可以选择尝......