C++_STL---list

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); //给迭代器重新赋值,防止迭代器失效
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

[c++] 可变参数模版

前言 可变参数模板是C11及之后才开始使用,学校的老古董编译器不一定能用 相信大家在刚入门c/c时都接触过printf函数 int printf ( const char * format, ... ); printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类…

【Java探索之旅】继承概念_语法_父类的成员访问

文章目录 &#x1f4d1;前言一、继承1.1 继承的概念1.2 继承语法1.3 继承发生后 二、父类的访问2.1 父类成员变量访问2.2 父类成员方法访问 &#x1f324;️全篇总结 &#x1f4d1;前言 在面向对象编程中&#xff0c;继承是一种重要的概念&#xff0c;它允许我们创建一个类&…

[go-zero] 简单微服务调用

文章目录 1.注意事项2.服务划分及创建2.1 用户微服务2.2 订单微服务 3.启动服务3.1 etcd 服务启动3.2 微服务启动3.3 测试访问 1.注意事项 go-zero微服务的注册中心默认使用的是Etcd。 本小节将以一个订单服务调用用户服务来简单演示一下&#xff0c;其实订单服务是api服务&a…

VSCode设置好看清晰的字体!中文用鸿蒙,英文用Jetbrains Mono

一、中文字体——HarmonyOS Sans SC 1、下载字体 官网地址&#xff1a;https://developer.huawei.com/consumer/cn/design/resource/ 直接下载&#xff1a;https://communityfile-drcn.op.dbankcloud.cn/FileServer/getFile/cmtyPub/011/111/111/0000000000011111111.20230517…

昇思25天学习打卡营第18天 | K近邻算法实现红酒聚类

1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;最初由 Cover和Hart于1968年提出(Cover等人,1967)&#…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…

【三级等保】等保整体建设方案(Word原件)

建设要点目录&#xff1a; 1、系统定级与安全域 2、实施方案设计 3、安全防护体系建设规划 软件全文档&#xff0c;全方案获取方式&#xff1a;本文末个人名片直接获取。

数据结构——二叉树相关题目

1.寻找二叉树中数值为x的节点 //寻找二叉树中数值为x的节点 BTNode* TreeFind(BTNode* root, BTDataType x)//传过来二叉树的地址和根的地址&#xff0c;以及需要查找的数据 {if (root Null){return Null;}//首先需要先判断这个树是否为空&#xff0c;如果为空直接返回空if (…

基于python的数据分解-趋势-季节性-波动变化

系列文章目录 前言 时间序列数据的分解&#xff0c;一般分为趋势项&#xff0c;季节变化项和随机波动项。可以基于加法或者乘法模型。季节变化呈现出周期变化&#xff0c;因此也叫季节效应(周期&#xff09;。 一、数据分解步骤 &#xff08;1&#xff09;估计时间序列的长期…

拓扑排序,PageRank(markov),实对称矩阵等

拓扑排序 多件事情有先后顺序&#xff0c;如何判断哪个先哪个后 拓扑排序算法&#xff1a; 1.读入图时&#xff0c;需要记录每个顶点的入度&#xff0c;以及相邻的所有顶点 2.将入度为0的顶点入队&#xff08;先进先出&#xff09; 3.取出队首元素a&#xff0c;&#xf…

rocketmq-console可视化界面功能说明

rocketmq-console可视化界面功能说明 登录界面OPS(运维)Dashboard(驾驶舱)Cluster(集群)Topic(主题)Consumer(消费者)Producer(生产者)Message(消息)MessageTrace(消息轨迹) rocketmq-console是rocketmq的一款可视化工具&#xff0c;提供了mq的使用详情等功能。 本章针对于rock…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

springboot + mybatis 多数据源切换

参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…

rancher管理多个集群

一、rancher部署 单独部署到一台机器上&#xff0c;及独立于k8s集群之外&#xff1a; 删除所有yum源&#xff0c;重新建yum源&#xff1a; # 建centos7.9的yum源 # cat CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the …

花所Flower非小号排名20名下载花所Flower

1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台&#xff0c;致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名&#xff0c;为用户提供多样化的数字资产交易服务&#xff0c;涵盖了主流和新兴数字货币的交易需求。 2. Flowe…

wordpress企业网站模板免费下载

大气上档次的wordpress企业模板&#xff0c;可以直接免费下载&#xff0c;连注册都不需要&#xff0c;网盘就可以直接下载&#xff0c;是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK&#xff08;Natural Language Toolkit&#xff09;时&#xff0c…

《向量数据库指南》——Milvus Cloud检索器增强的深度探讨:句子窗口检索与元数据过滤

检索器增强的深度探讨&#xff1a;句子窗口检索与元数据过滤 在信息爆炸的时代&#xff0c;高效的检索系统成为了连接用户与海量数据的关键桥梁。为了进一步提升检索的准确性和用户满意度&#xff0c;检索器增强技术应运而生&#xff0c;其中句子窗口检索与元数据过滤作为两大…