C++_STL---list

news2025/2/21 19:55:21

list的相关介绍

  1.  list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
  2.  list的底层是带头双向循环链表结构,链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
  3.  list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
  4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
  5. list需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)

想要了解更多关于list的详细内容,请点击list的文档介绍。

list的使用

注意:本章只介绍一些常用的接口

list的构造

构造函数接口说明代码演示
list()构造空的listlist<int> l1;
list(size_t n, const T& val = T())构造的list中包含n个值为val的元素

list<int> l2(5, 100);

// l2中放5个值为100的元素

list(const list<T>& x)拷贝构造函数list<int> l3(l2);
list(InputIterator first, InputIterator last)用[first, last)区间中的元素构造listlist<int> l4(l2.begin(), l2.end());
list(initializer_list<T> li)使用花括号进行构造(C++11)list<int> lt = { 1,2,3,4,5 };

list iterator的使用

list的迭代器,大家在这里可以暂时理解成一个指针,该指针指向list的某个节点。

函数说明接口说明
begin + end返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器
rbegin + rend返回第一个元素的reverse_iterator,即end位置,返回最后一个元素下一个位置的reverse_iterator,即begin位置
// 迭代器使用举例
int main()
{
    list<int> li = {1,2,3,4};
    list<int>::iterator it = li.begin();
    while (it != li.end())
    {
	    cout << *it << " ";
	    ++it;
    }
    return 0;
}

list的增删查改

函数声明接口说明代码演示
insert在list pos 位置中插入值为val的元素iterator insert(iterator pos, const T& val)
erase删除list pos 位置的元素iterator erase(iterator pos)
clear清空list的有效元素void clear()

注意:在list的接口里面没有提供[ ],因为效率不高

list的迭代器失效

相比vector,list的迭代器失效相对简单一些。

前面说过,此处大家可将迭代器暂时理解成类似于指针,迭代器失效 即迭代器所指向的节点已经不存在了,即该节点被删除了。因为list的底层结构为带头双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。

// 删除是偶数的数据
list<int> li = {1,2,3,4};
list<int>::iterator it = li.begin();
while (it != li.end())
{
	if (*it % 2 == 0)
        //li.erase(it);      会导致迭代器失效
		it = li.erase(it); //重新对迭代器进行赋值,就会避免失效的问题
	else
		++it;
}

注意:此处的迭代器失效只是针对vs下所说,不同平台的list底层实现结构不同,所以在其他平台下可能不会失效 

list的底层实现

迭代器的实现

与vector不同,vector的迭代器使用原生态指针就可以搞定,但list不行,因为list的底层结构是不连续的,所以对list的原生态指针进行了封装。

template<class T, class Ref, class Ptr>
//使用一个类封装原生态指针
struct listiterator
{
	typedef ListNode<T> Node;
	typedef listiterator<T, Ref, Ptr> Self;

	listiterator(Node* node)  //构造
		:_node(node)
	{}
	Self& operator++()        //前置++底层结构
	{
		_node = _node->_next;
		return *this;
	}
	Self operator++(int)      //后置++底层结构
	{
		Self tmp(*this);
		_node = _node->_next;

		return tmp;
	}
	Ref operator*()           //operator*底层结构
	{
		return _node->_data;
	}
	bool operator!=(const Self& it)
	{
		return _node != it._node;
	}

	Node* _node;              //包含一个结点的指针
};

常用接口实现

//拷贝构造
list(const list<T>& x)
{
	empty_list();             //对list进行初始化
	for (const auto& e : x)
	{
		push_back(e);
	}
}
//赋值
list<T>& operator=(list<T> x) 
{
	swap(_head,x._head);     //交换两个list的头节点
	return *this;
}
iterator insert(iterator pos, const T& val)
{
	Node* cur = pos._node;            //获取指向该结点的指针
	Node* newnode = new Node(val);
	Node* prev = cur->_prev;

	prev->_next = newnode;            //插入
	newnode->_prev = prev;
	newnode->_next = cur;
	cur->_prev = newnode;

	return iterator(newnode);
}
iterator erase(iterator pos)
{
	assert(pos != end());        //断言,防止删除头节点

	Node* cur = pos._node;       //获取指向该结点的指针
	Node* prev = cur->_prev;
	Node* next = cur->_next;

	prev->_next = cur->_next;    //删除
	next->_prev = prev;
	delete cur;

	return iterator(next);
}
void clear()            //清空list的有效数据
{
	list<T>::iterator it = begin();
	while (it != end())
	{
		it = erase(it); //给迭代器重新赋值,防止迭代器失效
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WAIC | 上海人形机器人创新中心 | 最新演讲 | 详细整理

前言 笔者看了7月4号的人形机器人与具身智能发展论坛的直播&#xff0c;并在7月5日到了上海WAIC展会现场参观。这次大会的举办很有意义&#xff0c;听并看了各家的最新成果&#xff0c;拍了很多照片视频&#xff0c;部分演讲也录屏了在重复观看学习 稍后会相继整理创立穹彻智…

使用RAID与LVM磁盘阵列技术

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、RAID磁盘冗余阵列 1、部署磁盘整列 2、损坏磁盘阵列及修复 3、磁盘阵列备份盘 4、删除磁盘阵列 二、LVM逻辑卷管理器 致谢 一、RAID…

linux中可执行文件在运行过程中为什么不能拷贝覆盖

对于一个普通的文件&#xff0c;假如有两个文件&#xff0c;分别是file和file1&#xff0c;我们使用 cp file1 file的方式使用file1的内容来覆盖file的内容&#xff0c;这样是可以的。 但是对于可执行文件来说&#xff0c;当这个文件在执行的时候&#xff0c;是不能通过cp的方…

Python 算法交易实验76 QTV200日常推进

说明 最近实在太忙&#xff0c; 没太有空推进这个项目&#xff0c;我想还是尽量抽一点点时间推进具体的工程&#xff0c;然后更多的还是用碎片化的时间从整体上对qtv200进行设计完善。有些结构的问题其实是需要理清的&#xff0c;例如&#xff1a; 1 要先基于原始数据进行描述…

【ROS2】初级:客户端-编写一个简单的服务和客户端(Python)

目标&#xff1a;使用 Python 创建并运行服务节点和客户端节点。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 1. 创建一个包2. 编写服务节点3. 编写客户端节点4. 构建并运行 摘要 下一步 相关内容 背景 当节点通过服务进行通信时&#xff0c…

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀目录 &#x1f4d2;1. 引言&#x1f4d9;2. 机器学习基础与广告营销的结合&#x1f9e9;机器学习在广告营销中的核心应用领域&#x1f339;用…

将大型语言模型模块化打造协作智能体

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 论文链接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任务环境中&#xff0c;多智能体合作问题因原始感官观察、高昂…

穿梭印度风情记:维乐 Angel Revo Halo坐垫,让每一寸旅程闪耀光辉!

想象骑乘在印度的万花筒世界中&#xff0c;斑斓色彩与悠久历史交织&#xff0c;每一转轮都是对神秘东方的深刻探索。在这样的骑行之旅中&#xff0c;维乐Angel Revo Halo坐垫不仅是你的坐骑上的宝石&#xff0c;更是舒适与探险的完美媒介。    探索印度的色彩与灵魂&#x…

每日一题~oj(贪心)

对于位置 i来说&#xff0c;如果 不选她&#xff0c;那她的贡献是 vali-1 *2&#xff0c;如果选他 &#xff0c;那么她的贡献是 ai. 每一个数的贡献 是基于前一个数的贡献 来计算的。只要保证这个数的前一个数的贡献是最优的&#xff0c;那么以此类推下去&#xff0c;整体的val…

【项目设计】负载均衡式——Online Judge

负载均衡式——Online Judge&#x1f60e; 前言&#x1f64c;Online Judge 项目一、项目介绍二、项目技术栈三、项目使用环境四、项目宏观框架五、项目后端服务实现过程1、comm模块设计1.1 Log.hpp实现1.2 Util.hpp实现 2、compiler_server 模块设计2.1compile.hpp文件代码编写…

【QT】容器类控件

目录 概述 Group Box 核心属性 Tab Widget 核心属性 核心信号 核心方法 使用示例&#xff1a; 布局管理器 垂直布局 核心属性 使用示例&#xff1a; 水平布局 核⼼属性 (和 QVBoxLayout 属性是⼀致的) 网格布局 核心属性 使用示例&#xff1a; 示例&#x…

【C++ OpenCV】机器视觉-二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算

原图 结果图 //包含头文件 #include <opencv2/opencv.hpp>//命名空间 using namespace cv; using namespace std;//全局函数声明部分//我的腐蚀运算 Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0) {uint32_t x 0, y 0;Mat dst(src.rows, src.cols, CV_8U…

设计模式之状态机模式

一、状态机模式介绍 状态机模式&#xff08;State Machine Pattern&#xff09;是一种用于描述对象行为的软件设计模式&#xff0c;属于行为型设计模式。在状态机模式中&#xff0c;对象的行为取决于其内部状态&#xff0c;并且在不同的状态下&#xff0c;对象可能会有不同的行…

RAG 案框架(Qanything、RAGFlow、FastGPT、智谱RAG)对比

各家的技术方案 有道的QAnything 亮点在&#xff1a;rerank RAGFLow 亮点在&#xff1a;数据处理index 智谱AI 亮点在文档解析、切片、query改写及recall模型的微调 FastGPT 优点&#xff1a;灵活性更高 下面分别按照模块比较各框架的却别 功能模块QAnythingRAGFLowFastG…

【手写数据库内核组件】01 解析树的结构,不同类型的数据结构组多层的链表树,抽象类型统一引用格式

不同类型的链表 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 不同类型…

Day05-04-持续集成总结

Day05-04-持续集成总结 1. 持续集成2. 代码上线目标项目 1. 持续集成 git 基本使用, 拉取代码,上传代码,分支操作,tag标签 gitlab 用户 用户组 项目 , 备份,https,优化. jenkins 工具平台,运维核心, 自由风格工程,maven风格项目,流水线项目, 流水线(pipeline) mavenpom.xmlta…

Android 10年,35岁,该往哪个方向发力

网上看到个网友发的帖子&#xff0c;觉的这个可能是很多开发人员都会面临和需要思考的问题。 不管怎样&#xff0c; 要对生活保持乐观&#xff0c;生活还是有很多的选择和出路的。 &#xff08;内容来自网络&#xff0c;不代表个人观点&#xff09; 《Android Camera开发入门》…

关闭vue3中脑瘫的ESLine

在创建vue3的时候脑子一抽选了ESLine,然后这傻卵子ESLine老是给我报错 博主用的idea开发前端 ,纯粹是用不惯vscode 关闭idea中的ESLine,这个只是取消红色波浪线, 界面中的显示 第二步,在vue.config.js中添加 lintOnSave: false 到这里就ok了,其他的我试过了一点用没有

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…

飞书 API 2-4:如何使用 API 将数据写入数据表

一、引入 上一篇创建好数据表之后&#xff0c;接下来就是写入数据和对数据的处理。 本文主要探讨数据的插入、更新和删除操作。所有的操作都是基于上一篇&#xff08;飞书 API 2-4&#xff09;创建的数据表进行操作。上面最终的数据表只有 2 个字段&#xff1a;序号和邮箱。序…