【C++】list容器

server/2025/1/20 14:01:22/

目录

学习途径

list的使用

list的一些构造

迭代器说明

接口使用

迭代器失效问题

list和vector对比

模拟实现list

迭代器的模拟(重点)

List.h文件


学习途径

在学习list之前,我们可以查询一些相关文档来学习!

文档详情:list文档学习

list的使用

list的一些构造

图:

构造使用示范:

迭代器说明

list中的迭代器和咋们印象中的迭代器一样:

begin指向第一个元素,end指向最后一个元素的后面一个位置!rbegin指向最后一个元素,rbegin指向第一个元素的前一个位置!

使用的时候要注意:

接口使用

常用接口

这里不做代码示范!比较简单!

迭代器失效问题

迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。

因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入 时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

list和vector对比

模拟实现list

迭代器的模拟(重点)

list的迭代器模拟和vector不一样!

因为list底层是带头的双向链表,而链表底层是节点连接而成的,不是连续的空间!

而vector底层是动态数组,是一块连续的空间!

所以我们如何将这一块一块的空间来遍历它!!!

我们可以用一个类包装它,这个类就叫迭代器,上图理解:

理解了这里,其他就水到渠成了!!!

List.h文件

#include<iostream>
#include<assert.h>
namespace ywc
{template<class T>struct list_node{T _data;list_node<T>* _next;list_node<T>* _prev;list_node(const T& data=T()):_data(data),_next(nullptr),_prev(nullptr){}};template<class T>struct list_iterator{typedef list_node<T> Node;typedef list_iterator<T> Self;Node* _node;list_iterator(Node* node):_node(node){}bool operator!=(const Self& s){return _node != s._node;}const T& operator*(){return _node->_data;}Self& operator++(){_node = _node->_next;return *this;}};template<class T>class list{typedef list_node<T> Node;public:typedef list_iterator<T> iterator;iterator begin(){return _head->_next;}iterator end(){return _head;}list(){_head = new Node;_head->_next = _head;_head->_prev = _head;_size = 0;}size_t size(){return _size;}void push_back(const T& x){insert(end(), x);}void push_front(const T& x){insert(begin(), x);}void insert(iterator pos, const T& x){Node* cur = pos._node;Node* prev = pos._node->_prev;Node* newnode = new Node(x);//prev newnode curnewnode->_next = cur;cur->_prev = newnode;prev->_next = newnode;newnode->_prev = prev;++_size;}void erase(iterator pos){assert(pos != end());Node* prev = pos._node->_prev;Node* next = pos._node->_next;prev->_next = next;next->_prev = prev;delete pos._node;--_size;}void pop_back(){erase(_head->_prev);}void pop_front(){erase(begin());}bool empty(){return _size==0;}private:Node* _head;size_t _size;};
}

我们下期见!!!


http://www.ppmy.cn/server/159900.html

相关文章

Redis学习笔记1【数据类型和常用命令】

Redis学习笔记 基础语法 1.数据类型 String: 最基本的类型&#xff0c;可以存储任何数据&#xff0c;例如文本或数字。示例值为 hello world。Hash: 用于存储键值对&#xff0c;适合存储对象或结构体。示例值为 {"name": "Jack", "age": 21}。…

sourceinsight主题配置 sourceinsight绿色护眼主题下载

良好的开发环境对提高效率和舒适度至关重要。Source Insight 作为一种流行的源代码编辑器,用户可以根据个人需求更换主题。本文将为您介绍“sourceinsight主题配置 sourceinsight绿色护眼主题下载”,帮助您使用中这一功能,并提供绿色护眼主题的下载资源。 图1:Source Insig…

02内存结构篇(D2_剖析运行数据区)

目录 学习前言 一、程序计数器 1. 作用 2. 存储的数据 3. 异常 三、Java虚拟机栈 1. 栈帧 1.1. 局部变量表 存储内容 存储容量 其他 1.2. 操作数栈 作用 存储内容 存储容量 1.3. 动态连接 1.4. 方法返回 1.5. 附加信息 2. 栈异常 四、本地方法栈 1. 本地方…

Spring Web MVC综合案例

承接上篇文章——Spring Web MVC探秘&#xff0c;在了解Spring Web MVC背后的工作机制之后&#xff0c;我们接下来通过三个实战项目&#xff0c;来进一步巩固一下前面的知识。 一、计算器 效果展示&#xff1a;访问路径&#xff1a;http://127.0.0.1:8080/calc.html 前端代码&a…

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

模块化架构与微服务架构,哪种更适合桌面软件开发?

前言 在现代软件开发中&#xff0c;架构设计扮演着至关重要的角色。两种常见的架构设计方法是模块化架构与微服务架构。它们各自有独特的优势和适用场景&#xff0c;尤其在C#桌面软件开发领域&#xff0c;模块化架构往往更加具有实践性。本文将对这两种架构进行对比&#xff0…

Python----Python高级(模块与包,Python基本库)

一、模块 1.1、概念 就是一个包含了Python代码的以.py为后缀的Python文件&#xff0c;可以被其他 Python程序导入和使用&#xff0c;也可以自己独立执行&#xff0c;里面存放着的是一组相关的函 数或者类&#xff0c;比如查看关键字列表时导入的keyword模块。 1.2、作用 令Py…

【VRChat · 改模】Unity工程导入人物模型;并添加着色器教程;

一、Unity工程导入人物模型 1.创建一个新的工程文件&#xff08;使用 VRChat 官方的开发工具 VCC&#xff09; 不添加着色器的时候&#xff0c;模型是粉色的 2.导入人物模型 在工程文件的 Assets 目录下&#xff0c;创建一个新的目录&#xff0c;可以起名为你的模型的名字 …