【C++之容器篇】造轮子:list的模拟实现与使用
目录
- 前言
- 一、关于list
- 1. 简介
- 2. 成员类型
- 二、默认成员函数
- 1. 构造函数
- 1. list()
- 2. list(size_t n,const T& val = T())和list(InputIterator first,InputIterator last)
- 2. 拷贝构造函数
- 3. 析构函数
- 4. 赋值运算符重载函数
- 三、迭代器
- 1. 普通对象的正向迭代器
- 2. const对象的正向迭代器
- 3. 普通对象的反向迭代器
- 4. const对象的反向迭代器
- 四、容量接口
- 1. empty()
- 2. size()
- 五、元素访问接口
- 1. front()
- 2. back()
- 六、修改接口
- 1. push_front()
- 2. pop_front()
- 3. push_back()
- 4. pop_back()
- 5. insert()
- 6.erase()
前言
前面我们已经学习了string和vector的模拟实现和使用,相信对于容器的模拟实现和使用的能力已经上升一定的水平,今天我们要学习的是list的模拟实现,List的模拟实现和string和vector其实没有本质的区别,只是在list的模拟实现过程中,list的迭代器和string和vector有所不同,这是我们实现List的模拟实现中需要重点掌握的,今天学习的List本质就是一个带头双向循环链表。
一、关于list
1. 简介

list本质就是一个带头双向循环链表,支持在任何位置以O(1)的时间进行插入和删除。
2. 成员类型

看到上图,我们一定要知道迭代器的类型:list中的迭代器的类型是双向迭代器,其他的迭代器类型好还有:单向迭代器,随机迭代器。
- 单向迭代器:只支持单向遍历访问的迭代器,只支持++,不支持–
- 双向迭代器:支持双向访问容器的迭代器,同时支持++和–
- 随机迭代器:支持随机访问容器的迭代器,同时支持++,–,+,-
二、默认成员函数
1. 构造函数

1. list()
- 使用代码
void test_list1()
{// 无参构造函数list<int> lt1;// 创建一个存储int的list对象list<char> lt2;// 创建一个存储char的list对象list<double> lt3;// 创建一个存储double的list对象list<string> lt4;// 创建一个存储string的list对象
}
2. list(size_t n,const T& val = T())和list(InputIterator first,InputIterator last)
- 使用代码:
void test_list2()
{// 用n个值来构造Listlist<int> lt1(3, 6);// 用3个6来构造一个list对象// 使用一段迭代器区间来构造string s2("hello list::list(InputIterator first,InputIterator last)");vector<char> v2(s2.begin(), s2.end());list<char> lt2(v2.begin(), v2.end());// 遍历// 使用迭代器进行遍历// 遍历lt1cout << "lt1:" << endl;list<int>::iterator lit1 = lt1.begin();while (lit1 != lt1.end()){cout << *lit1 << " ";lit1++;}cout << endl;// 遍历lt2cout << "lt2:" << endl;list<char>::iterator lit2 = lt2.begin();while (lit2 != lt2.end()){cout << *lit2 << " ";lit2++;}cout << endl;// 使用范围for进行遍历cout << "lt1:" << endl;for (auto& e : lt1){cout << e << " ";}cout << endl;cout << "lt2:" << endl;for (auto& e : lt2){cout << e << " ";}cout << endl;}
运行结果:

2. 拷贝构造函数

拷贝构造函数和前面的容器样子还是差不多
void test_list3()
{string s("hello list(const list<char>& lt)");list<char> lt1(s.begin(), s.end());list<char> lt2(lt1);cout << "lt1:" << endl;for (auto& e : lt1){cout << e << " ";}cout << endl;cout << "lt2" << endl;for (auto& e : lt2){cout << e << " ";}cout << endl;
}
运行结果:

3. 析构函数
4. 赋值运算符重载函数

- 使用代码:
void test_list4()
{string s("hello list<char>& operator=(const list<char>& lt)");list<char> lt(s.begin(), s.end());list<char> lt1;lt1 = lt;// 调用赋值运算符重载函数cout << "lt:" << endl;for (auto& e : lt){cout << e << " ";}cout << endl;cout << "lt1:" << endl;for (auto& e : lt1){cout << e << " ";}cout << endl;}
运行结果:

三、迭代器
1. 普通对象的正向迭代器
- 使用代码:
void test_list5()
{string s("hello list<char>::iterator begin() and end()");list<char> lt(s.begin(), s.end());list<char>::iterator lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";lit++;}cout << endl;
}
运行结果:

2. const对象的正向迭代器
- 使用代码:
void test_list6()
{string s("hello list<char>::const_iterator begin() and end()");const list<char> lt(s.begin(), s.end());list<char>::const_iterator lit = lt.begin();while (lit != lt.end()){cout << *lit << " ";lit++;}cout << endl;
}
运行结果:

3. 普通对象的反向迭代器
使用代码:
void test_list7()
{string s("hello list<char>::reverse_iterator begin() and end()");list<char> lt(s.begin(), s.end());list<char>::reverse_iterator lit = lt.rbegin();while (lit != lt.rend()){cout << *lit << " ";lit++;}cout << endl;
}
4. const对象的反向迭代器
四、容量接口
1. empty()
2. size()
五、元素访问接口
1. front()
2. back()
六、修改接口
1. push_front()
2. pop_front()
3. push_back()
4. pop_back()
5. insert()
6.erase()
相关文章:
【C++之容器篇】造轮子:list的模拟实现与使用
目录前言一、关于list1. 简介2. 成员类型二、默认成员函数1. 构造函数1. list()2. list(size_t n,const T& val T())和list(InputIterator first,InputIterator last)2. 拷贝构造函数3. 析构函数4. 赋值运算符重载函数三、迭代器1. 普通对象的正向迭代器2. const对象的正向…...
自动驾驶:决策规划算法岗位面经分享
本专栏分享 计算机小伙伴秋招春招找工作的面试经验和面试的详情知识点 专栏首页: 主要分享计算机算法类在面试互联网公司时候一些真实的经验 人情况是985本硕,硕士研究方向是强化学习在移动机器人路径规划中的应用,一段自动驾驶中小厂实习经历,秋招找的大都是机器人和自动驾…...
2.7、进程调度的时机、切换与过程、方式
1、进程调度的时机 进程调度\color{red}进程调度进程调度(低级调度),就是按照某种算法从就绪队列中选择一个进程为其分配处理机 进程在操作系统内核程序临界区\color{red}操作系统内核程序临界区操作系统内核程序临界区中不能\color{red}不能…...
工程管理系统源码+项目说明+功能描述+前后端分离 + 二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
ESP32S3系列--SPI从机驱动详解(一)
一、目的 在之前的博文中《ESP32S3系列--SPI主机驱动详解(一)》、《ESP32S3系列--SPI主机驱动详解(二)》我们详细讲解了ESP32S3上的SPI外设如何工作在主机模式并通过代码的形式帮助大家理解。 本篇我们将介绍SPI外设工作在从机模式下的使用知识点。 二、介绍 参考资料 http…...
【实战篇】移动端H5网页在ios滑动不流畅和禁止缩放问题
问题描述:移动端H5网页在ios滑动不流畅和禁止缩放问题 最近开发小程序,有一个富文本展示页面使用的是<webview>H5网页嵌入的,当你用 overflow-y:scroll 属性的时候,内容超出容器溢出滚动的效果很迟顿,特别是在IOS系统中,而且页面还会缩放。 解决方案: 1…...
12 循环神经网络(基础篇) Basic RNN
文章目录问题引入关于权重权重共享RNN CellRNN原理RNN计算过程代码实现RNN Cell维度说明代码RNN维度说明NumLayers说明计算过程代码参考实例问题分析多分类问题代码RNN CellRNN改进Embedding网络结构Embedding说明Linear说明代码课程来源: 链接课程文本参考…...
【C语言必经之路——第11节】初阶指针(2)
五、指针的运算1、指针与整数相加减看一下下面的代码:#include<stdio.h> int my_strlen(char* str) {int count0;while(*str!\0){count;str;//指针加减整数}return count; } int main() {int lenmy_strlen("abcdef");printf("%d\n",len);…...
SpringBoot学习(1)第一个SpringBoot程序
之前的SpringMVc就不在记录了,好像时间不太够了,但是springmvc作为javaweb的升级学一学对于springboot还是有较大的帮助的。 首先我们需要引入依赖,但是请注意,其中的一个不算是依赖,写法有所不同 首先需要引入 <…...
什么是热迁移?90%的企业都理解错误
科技的发展,新冠的冲击,让市场竞争愈发激烈。尽管云计算服务为企业免除了基础硬件的建设和维护成本,当企业需要进行业务跨架调整、升级维护、环境测试等场景而进行云迁移,其过程中所带来的停机时间,就变得尤为头疼了。…...
Scratch少儿编程案例-丝滑版贪吃蛇
专栏分享 点击跳转=>Unity3D特效百例点击跳转=>案例项目实战源码点击跳转=>游戏脚本-辅助自动化点击跳转=>Android控件全解手册点击跳转=>Scratch编程案例👉关于作者...
Linux系统之网卡子接口配置方法
Linux系统之网卡子接口配置方法一、本地系统环境检查1.检查系统版本2.检查系统内核版本3.检查本地IP地址二、网卡子接口介绍1.网卡子接口简介2.网卡子接口的优点3.网卡子接口的缺点三 加载802.1q 模块1.查看系统802.1q 模块信息2.加载802.1q 模块3.检查802.1q 模块加载状态四、…...
2023上半年软考中级系统集成项目管理工程师2月25日开班
系统集成项目管理工程师是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目之一,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职…...
YOLO-V5轻松上手
之前介绍了YOLO-V1~V4版本各做了哪些事以及相较于之前版本的改进。有的人或许会想“直接学习最近版本的算法不好吗”,在我看来,每一个年代的版本/算法都凝聚着当年学术界的智慧,即便是它被淘汰了也依旧有值得思考的地方,或是可以使…...
CSS的优先级理解
权重 的 4个等级定义我们把特殊性分为4个等级,每一个等级代表一类选择器,每个等级的值相加得出选择器的权重。4个等级的定义如下:第一等级:代表内联样式,如style"",权值为 1000第二等级ÿ…...
前端工程师leetcode算法面试必备-二分搜索算法(中)
一、前言 二分搜索算法本身并不是特别复杂,核心点主要集中在: 有序数组:指的是一个递增或者递减的区间(特殊情况如:【852. 山脉数组的峰顶索引】); 中间数:用来确定搜索目标落在左…...
【数据库】MySQL 单表查询,多表查询
目录 单表查询 一,创建表worker 1,创建表worker的sql代码如下: 2,向worker表中插入信息 二, 按要求进行单表查询 1、显示所有职工的基本信息。 2、查询所有职工所属部门的部门号,不显示重复的部门号。 …...
【c++】vector实现(源码剖析+手画图解)
vector是我接触的第一个容器,好好对待,好好珍惜! 目录 文章目录 前言 二、vector如何实现 二、vector的迭代器(原生指针) 三、vector的数据结构 图解: 四、vector的构造及内存管理 1.push_back() …...
VScode查看python f.write()的文件乱码
VScode查看python f.write()的文件乱码 在使用 VScode 编写 python 代码, print(),汉字正常显示, 使用 with open()as f: f.write()文件后, 在 …...
excel应用技巧:如何用函数制作简易抽奖动图
利用INDEX函数和随机整数函数RANDBETWEEN配合,在Excel中做一个简单的抽奖器,可以随机抽取姓名或者奖品。有兴趣的伙伴可以做出来试试,撞撞2023年好运气。每次年会大家最期待的就是抽奖环节。为了看看自己今年运气怎么样,会不会获奖…...
WiFiEsp库深度解析:AT模式下ESP8266与Arduino的可靠WiFi驱动
1. WiFiEsp 库深度技术解析:面向嵌入式工程师的 AT 模式 ESP8266 驱动实践指南1.1 工程定位与设计哲学WiFiEsp 是一个面向 Arduino 生态的AT 命令桥接型 WiFi 驱动库,其核心价值不在于替代 ESP8266 的原生 SDK 开发,而在于为传统 MCU…...
ONLYOFFICE Docs合规性检查自动化:CI/CD流程中的安全扫描终极指南
ONLYOFFICE Docs合规性检查自动化:CI/CD流程中的安全扫描终极指南 【免费下载链接】DocumentServer ONLYOFFICE Docs is a free collaborative online office suite comprising viewers and editors for texts, spreadsheets and presentations, forms and PDF, ful…...
Mapus企业级应用场景:从团队协作到商业决策支持的完整指南
Mapus企业级应用场景:从团队协作到商业决策支持的完整指南 【免费下载链接】mapus A map tool with real-time collaboration 🗺️ 项目地址: https://gitcode.com/gh_mirrors/ma/mapus Mapus是一款开源的实时协作地图工具,专为团队协…...
Qwen3-ASR-0.6B开源可部署:完全本地化语音识别,数据不出内网
Qwen3-ASR-0.6B开源可部署:完全本地化语音识别,数据不出内网 想象一下,你有一份重要的内部会议录音需要整理成文字,或者需要处理大量客户电话录音进行分析。把音频上传到云端服务?数据安全和隐私风险让你犹豫不决。自…...
Alpamayo-R1-10B惊艳效果:Diffusion解码器生成的平滑连续轨迹
Alpamayo-R1-10B惊艳效果:Diffusion解码器生成的平滑连续轨迹 1. 引言:当AI学会“看路”与“思考” 想象一下,一辆自动驾驶汽车行驶在复杂的城市路口。它需要同时“看到”前方、左侧、右侧的车辆和行人,理解“安全通过路口”的指…...
STM32duino VL53L4CX多目标ToF测距驱动详解
1. 项目概述STM32duino VL53L4CX 是一个面向 STM32 平台(兼容 Arduino API 风格)的开源驱动库,专为意法半导体(STMicroelectronics)推出的 VL53L4CX 高精度飞行时间(Time-of-Flight, ToF)测距传…...
嵌入式开发实战:SPI模式驱动SD NAND的完整流程与避坑指南(基于STM32F10x)
嵌入式开发实战:STM32F10x SPI驱动SD NAND全流程与高频问题解析 在物联网终端设备和便携式仪器仪表开发中,嵌入式存储解决方案的选择往往直接影响产品可靠性和生产成本。SD NAND作为贴片式存储芯片的代表,兼具SD卡的大容量特性和SPI Flash的硬…...
保姆级教程:用Protel99SE从抄板PCB中精准导出SMT贴片坐标(附Excel整理技巧)
从抄板PCB到SMT贴片:Protel99SE坐标导出与Excel数据清洗全流程解析 在硬件设计与生产衔接的关键环节中,PCB抄板后的文件处理往往是最容易被忽视却至关重要的步骤。当工程师拿到一份通过反向工程获得的DDB文件时,如何准确提取元件坐标并转换为…...
终极RS ASIO教程:3个步骤让你的摇滚史密斯告别音频延迟
终极RS ASIO教程:3个步骤让你的摇滚史密斯告别音频延迟 【免费下载链接】rs_asio ASIO for Rocksmith 2014 项目地址: https://gitcode.com/gh_mirrors/rs/rs_asio 你是否曾经在弹奏《摇滚史密斯2014》时感到音符响应总慢半拍?那种音频延迟不仅影…...
cv_resnet101_face-detection_cvpr22papermogface部署教程:NVIDIA Triton推理服务器集成方案
cv_resnet101_face-detection_cvpr22papermogface部署教程:NVIDIA Triton推理服务器集成方案 1. 引言 人脸检测是计算机视觉领域最基础也最核心的任务之一。无论是安防监控、手机解锁,还是社交媒体的美颜滤镜,背后都离不开一个快速、准确的…...
