c++之stl_list

【C++】STL——list(万字详解 list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。 阅读详情

c++之stl_list

一、list的内存结构

在cpp中,list容器是双向链表,对应c#中的LinkedList。链表的内存是不连续的,通过节点(node)串起来。

  1. 优点:
    • 高效插入删除。只需对指针进行操作,不需要拷贝元素。
    • 不需要连续内存,就可以完成动态操作。增加元素,即增加节点。
  2. 缺点:
    • 不支持随机访问,即索引器,[]操作符。
    • 需要额外内存来维护node节点。

接下来看看list是怎样设计的。

在这里插入图片描述

从图中可以看出,list不仅是双向的,还是环状的。整个list是由node串起来的,node里有两根指针,prev、next,以及一个data。prev指向前一个node,next指向后一个node。end()里没有data,这是为了遵循前闭后开原则,stl里其他容器也是一样。

二、具体实现

1. list的node

    template <typename T>
    struct list_node
    {
   
   
        typedef list_node<T> *node_ptr;
        typedef T value_type;

        value_type data;
        node_ptr prev;
        node_ptr next;

        list_node(const value_type &val) : data(val), prev(NULL), next(NULL) {
   
   }
    };

2. list的迭代器

    template <typename T>
    struct list_iterator {
   
   
        list_node<T> node;
        //......
        ref operator*() const {
   
   return node->data;}
        ptr operator->() const {
   
   return &(operator*());}
        self &operator++(){
   
   node = node->next; return *this;}
        self &operator--(){
   
   node = node->prev; return *this}
        bool &operator==(cosnt self &ths){
   
   return node == ths.node};
        //......
    };
    struct reverse_list_iterator {
   
   /* ..... */};
由于list的内存空间不连续,无法直接使用指针操作,所以必须重载++、--操作符,且不提供[]操作符。++操作其实就是将迭代器中的node指向下一个node,很容易理解。为了让迭代器能像指针一样使用,需要对*、->操作符进行重载,使其能够轻松获取到node中的data。操作符重载是cpp重要的一部分,虽然设计起来比较麻烦,但是能够让使用者用得很舒服。

3. list的常用方法

    void push_back(const value_type &val);//后端插入
    void push_front(const value_type &val);//前端插入
    void insert(iterator positon, const value_type &val);//任意一个位置插入
    void pop_front();//前端删除
    void pop_back();//后端删除
    void remove(const value_type &val);//删除所有指定元素
    iterator earse(iterator position);//删除任意一个节点
    void clear();//清空容器
list只需要一根node指针,一般称作为head(里面不装data,仅作为标记使用,为了遵循前闭后开区间的原则),配合iterator,就可以管理整个链表。操作list、iterator中的node指针,可以很快、很轻松的完成插入删除、操作。

在这里插入图片描述

4. 完整代码

为了保证简洁,可以忽略reverse iterator部分,本文reverse iterator的实现不妥,应采用迭代器适配器(iterator adaptor)来实现。

    #if !defined(_M_LIST_)
    #define _M_LIST_

    #include <memory>

    namespace learnCpp
    {
   
   
    template <typename T>
    struct list_node
    {
   
   
        typedef list_node<T> *node_ptr;
        typedef T value_type;

    public:
        value_type data;
        node_ptr prev;
        node_ptr next;

        list_node() : prev(NULL), next(NULL) {
   
   }
        list_node(const value_type &val) : data(val), prev(NULL), next(NULL) {
   
   }
    };

    template <typename T>
    struct list_iterator
    {
   
   
    protected:
        typedef T value_type;
        typedef T *ptr;
        typedef T &ref;
        typedef list_iterator<T> self;
        typedef list_node<T> *link_type;

    public:
        link_type node;

        list_iterator(link_type node = nullptr) : node(node) {
   
【C++STL基础入门】list基本使用 STL(Standard Template Library)是C++标准库的一个重要组成部分,提供了一套丰富的数据结构和算法,可以大大简化C++程序的开发过程。其中,list容器是STL提供的一种双向链表实现的数据结构,具有高效的插入和删除操作,适用于需要频繁插入和删除元素的场景。本文将介绍list容器的基本使用方法,包括头文件的引入、定义和构造函数、属性函数以及运算符和算法的示例代码。STL(标准模板库)的list是C++中的一种数据结构,用于存储和操作链表。 阅读详情

相关推荐

从ESP/ABS选型看轮速传感器:为什么你的车用了AK+PWM+7/14mA三种协议?

本文深入解析了汽车轮速传感器的三种主流协议(7/14mA电流型、PWM型和AK协议型)及其混合应用场景。通过对比不同协议的技术特点、成本效益和工程挑战,揭示了现代车辆采用多种传感器协议背后的设计逻辑,包括成本控制、性能平衡和冗余设计等关键因素。

weixin_29266679的博客 530

有源滤波电路设计

目录一、低通滤波器1、同相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(压控电压源;Sallen-Key)2、反相输入低通滤波器(1)一阶低通滤波电路(2)二阶低通滤波电路(无限增益多路反馈)二、高通滤波器1、同相输入高通滤波器(1)一阶高通滤波电路(2)二阶高通滤波电路(压控电压源;Sallen-Key)2、反相输入高通滤波电路(1)二阶高通滤波电路(无限增益多路反馈) 一、低通滤波器 1、同相输入低通滤波器 (1)一阶低通滤波电路 即在一阶无源低通滤波器的基础上,加了一个集成运放。 它的

qq_41873236的博客 3万+

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1247

LD分析实战:基于Plink和R的连锁不平衡计算与可视化全流程

本文详细介绍了基于Plink和R的连锁不平衡(LD)分析全流程,包括基因型数据预处理、LD计算参数设置及结果可视化技巧。通过实战案例解析PLINK文件格式转换、r²值计算关键参数,并展示如何使用ggplot2绘制高质量LD热图,帮助研究人员高效完成基因组关联分析。

weixin_29074295的博客 318

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341)

[ vulhub漏洞复现篇 ] Drupal XSS漏洞 (CVE-2019-6341) Drupal是使用PHP语言编写的开源内容管理框架(CMF),它由内容管理系统(CMS)和PHP开发框架(Framework)共同构成,在GPL2.0及更新协议下发布。Drupal在某些情况下,通过文件模块或者子系统上传恶意文件触发XSS漏洞。

qq_51577576的博客 2205

ComfyUI整合包、秋叶ComfyUI、Florence节点报错下载并加载Florence2模型No module named ‘timm.layers‘、ComfyUI报错解决

步骤操作1打开2地址栏输入cmd并回车3输入命令:4安装完成后重新打开 ComfyUI,执行工作流,即可解决报错。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1237

linux系统中实现智能家居的基本方法

使用QT开发智能家居中的一个物联应用,通过云服务器远程控制设备与设备进行通信。在生活中,可以使用WIFI智能插座控制电器开关,比如远程开启热水器,远程打开空调,窗帘等等。包括:WIFI联网,注册到云服务器上,编写QT UI通过网络来与云服务器通信,然后再下发指令到这个连网的设备。硬件说明:需要有一个串口转WIFI模块,另外需要加上一个USB-TTL模块,外加一根T口USB连接线,可接入PC电脑调试。

嵌入式技术开发 2608

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1911

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: c++之stl_vector
下一篇: c++之stl_deque
sarono
博客等级 码龄9年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值