list的特性及使用

1、list的介绍

 1.list是序列容器,允许在序列的任何位置进行时间复杂度为o(1)的插入和删除操作,并且由双向迭代器。

2.list的底层是双链表,双链表不是物理上连续的储存空间,而是不同的地址空间通过next和prev指针连接成顺序表。

3.list相较于其他的顺序序列容器(deque,vector),主要缺点是不能通过下标进行访问元素,要访问元素只能通过迭代器的方式顺序访问。

如下草图所示

2、list成员说明

3、list对象的构造 

list对象的构造可以通过花括号,初始化列表,圆括号,以及复制拷贝其他list对象的方式 。

default (1)
explicit list (const allocator_type& alloc = allocator_type());
fill (2)
explicit list (size_type n);
         list (size_type n, const value_type& val,
                const allocator_type& alloc = allocator_type());
range (3)
template <class InputIterator>
  list (InputIterator first, InputIterator last,
         const allocator_type& alloc = allocator_type());
copy (4)
list (const list& x);
list (const list& x, const allocator_type& alloc);
move (5)
list (list&& x);
list (list&& x, const allocator_type& alloc);
initializer list (6)
list (initializer_list<value_type> il,
       const allocator_type& alloc = allocator_type());

 

4、list元素访问 

 

 1、front()返回list容器的首元素的引用

2、back()返回list容器的尾元素的引用

int main()
{
	list <int> l1{ 1,2,3,4,5,6,7,8 };

	cout << l1.front() << endl;
	cout << l1.back() << endl;

	return 0;
}

5、迭代器 

参见cplusplus官网的迭代器声明

 begin()为正向迭代器的头,end为正向迭代器的尾,方向由list容器的第一个元素到最后一个元素移动,rbegin()为反向迭代器的头,rend为反向迭代器的尾,方向由list容器的最后一个元素到第一个元素。

 

#include<iostream>
#include<list>
using namespace std;
int main()
{
	list <int> l1{ 1,2,3,4,5,6,7,8 };
	list<int>::iterator it1 = l1.begin();
	list<int>::reverse_iterator it3 = l1.rbegin();
	list<int>::iterator it2 = l1.end();
	list<int>::reverse_iterator it4 = l1.rend();
	for (; it1 != it2; it1++)
	{
		cout << *it1 << " ";
	}
	cout << endl;
	for (; it3 != it4; it3++)
	{
		cout << *it3 << " ";
	}
	cout << endl;
	return 0;
}

 6、容器

  1、empty()

判断容器是否为空,即检查迭代器begin()和end()是否相等,相等则为空,返回真,不想等则不为空,返回假;

int main()
{
    list<int> l1 = { 1,2,3,4,5,6,7 };
    bool flag = l1.empty();
    if (!flag)
    {
        cout << "不为空" << endl;
    }

else{

cout<<"为空"<<endl;}
    return 0;
}

 2、size()

返回容器的元素个数

3、max_size()

返回根据系统或者库实现限制的容器可保有的元素最大数量,即对于最大容器的容量

#include<iostream>
#include<list>
using namespace std;

int main()
{
	list<int> l1 = { 1,2,3,4,5,6,7 };
	cout << l1.empty() << endl;
	cout << l1.size() << endl;
	cout << l1.max_size()<< endl;
	return 0;
}

7、修改器 增删查改等功能


void clear();    从容器擦除所有元素。此调用后 size() 返回零。
iterator insert( iterator pos, const T& value );    在 pos 前插入 value 。
void insert( iterator pos, size_type count, const T& value );    在 pos 前插入 value 的 count 个副本。
template< class InputIt >    
void insert( iterator pos, InputIt first, InputIt last);    在 pos 前插入来自范围 [first, last) 的元素
iterator insert( const_iterator pos, std::initializer_list ilist );    在 pos 前插入来自 initializer_list ilist 的元素
iterator erase( iterator pos );    移除位于 pos 的元素。
iterator erase( iterator first, iterator last );    移除范围 [first; last) 中的元素。
void pop_back();    移除容器的末元素。
void push_front( const T& value );    前附给定元素 value 到容器起始。
void push_back( const T& value );    后附给定元素 value 到容器尾。
void pop_front();    移除容器首元素。
void resize( size_type count );    重设容器大小以容纳 count 个元素。
void resize( size_type count, T value = T() );    count - 容器的大小,value - 用以初始化新元素的值
void swap( list& other );    将内容与 other 的交换

  8、vector与list对比,优缺点比较

区别vectorlist
底层实现连续储存空间容器,内存动态开辟,在堆上分配空间动态双向链表 ,在堆上
空间利用率不造成内存碎片,空间利用率高节点不连续,存储空间在物理上不连续,密度小,空间利用率低
访问元素方式迭代器,下标,随机访问只能迭代器
插入和删除

插入元素push_back() ,时间复杂度为o(1),

删除元素pop_back(),时间复杂度为o(1);

在非尾部插入元素“insert(iterator pos,value_type val);时间复杂度o(n);

erase(iterator pos):时间复杂度为o(n);

resize();开辟空间,储存数据;

reverse():开辟空间,不储存数据

插入:o(1).需要开辟空间;

push_back (x),

erase(),时间复杂度:o(n)

迭代器连续的储存空间,支持随即迭代器,迭代器越界会发生检查内存空间不连续,不支持随机访问,只能顺序访问,双向迭代器越界检查,

在插入或者删除元素时,可能会导致迭代器失效的情况

vector和list的使用场景



 1、vector拥有一段连续的储存空间,因此支持随机访问,如果需要大量随机高效的访问,不在乎插入和删除的消耗时,考虑使用vector

2、list用一段不连续的地址空间,如果需要进行大量的插入删除操作,则可以考虑使用list。

下一篇文章,我会和大家讲解迭代器失效的场景以及处理方法,见下篇!!!

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

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

相关文章

【每天学会一个渗透测试工具】AppScan安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 https://www.hcl-software.com/appscan AppScan是一种综合型漏洞扫描工具&#xff0c;采用SaaS解决方案&#xff0c;它将所以…

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中&#xff0c;控制器的设计至关重要&#xff0c;它直接影响无人机的稳定性和响应能力。然而&#xff0c;要设计出高效、可靠的控制器&#xff0c;首先必须准确理解无人机的动态行为&#xff0c;这就需要通过收集输入输出数据来辨识其运动学模型。…

天池人脸识别项目复现

1 项目背景 #c 概述 项目的目的 图像分类是整个计算机视觉领域中最基础的任务&#xff0c;也是最重要的任务之⼀&#xff0c;最适合拿来进⾏学习实践。为了让新⼿们能够⼀次性体验⼀个⼯业级别的图像分类任务的完整流程&#xff0c;本次我们选择带领⼤家完成⼀个对图片中⼈脸进…

从0开始C++(二):类、对象、封装

目录 类&对象的概念 类的内容 对象的创建 ● 栈内存对象 ● 堆内存对象 封装 类&对象的概念 类和对象是一个比较抽象的概念&#xff0c;这里直接用一个实例方便理解。 类&#xff1a;类是一个抽象的概念&#xff0c;用来描述同一类对象的特点&#xff08;比如&am…

从零开始如何学习人工智能?

说说我自己的情况&#xff1a;我接触AI的时候&#xff0c;是在研一。那个时候AlphaGo战胜围棋世界冠军李世石是大新闻&#xff0c;人工智能第一次出现我面前&#xff0c;当时就想搞清楚背后的原理以及这些技术有什么作用。 就开始找资料&#xff0c;看视频。随着了解的深入&am…

第 三 方 组 件 e l e m e n t - u i[Vue]

一、组件之间的传值 组件可以由内部的Data提供数据&#xff0c;也可以由父组件通过prop的方式传值。 兄弟组件之间可以通过Vuex等统一数据源提供数据共享 第一种 Movie.vue <template><div><h1>我才不要和你做朋友</h1></div></template&…

怎么为自己的VPS选择合适的CPU和RAM?

为网站选择VPS&#xff08;虚拟专用服务器&#xff09;与为家庭或办公室选择台式机或笔记本电脑没有什么不同。基本上&#xff0c;您要做的就是查看硬件配置并比较功能和价格。 然而&#xff0c;虽然您可能对个人计算机所需的资源类型有一个粗略的估计&#xff0c;但为服务器获…

API接口测试要注意什么?API接口如何开发?

API接口怎么保证数据安全&#xff1f;如何安全调用邮件API接口&#xff1f; API接口不仅能够确保系统的稳定性和可靠性&#xff0c;还能提高开发效率和用户满意度。然而&#xff0c;要进行有效的API接口测试&#xff0c;需要注意多个方面。AokSend将介绍一些关键点&#xff0c…

全面赋能,永久免费!讯飞星火API能力正式免费开放

2023年5月&#xff0c;讯飞星火正式发布&#xff0c;迅速成为千万用户获取知识、学习知识的“超级助手”&#xff0c;成为解放生产力、释放想象力的“超级杠杆”。 2024年5月&#xff0c;讯飞星火API能力正式免费开放&#xff0c;携手生态开发者加快大模型赋能刚需场景。 领…

【软件工程】【22.10】p1

关键字&#xff1a; 软件需求分类、性能需求、数据流图加工、用例关系、捕获系统功能用例、RUP设计层术语、故障、调试、集成测试、需求分析过程、CMMI实践部件、CMMI能力等级 软件需求规约基本性质、模块控制、协作、UML结点、事件、RUP体系结构、RUP移交、静态评估技术、测…

Java共享台球室无人系统支持微信小程序+微信公众号

共享台球室无人系统 &#x1f3b1; 创新台球体验 近年来&#xff0c;共享经济如火如荼&#xff0c;从共享单车到共享汽车&#xff0c;无一不改变着我们的生活方式。而如今&#xff0c;这一模式已经渗透到了更多领域&#xff0c;共享台球室便是其中之一。不同于传统的台球室&a…

DOPE-FITC在细胞定位、动态追踪等方面的应用-星戈瑞

DOPE-FITC作为一种荧光标记磷脂&#xff0c;在细胞生物学研究中发挥着科研作用。其荧光特性和与细胞膜的亲和性&#xff0c;使其成为细胞定位、动态追踪等方面的工具。 细胞定位 DOPE-FITC能够有效地标记细胞膜&#xff0c;使得细胞膜在荧光显微镜下呈现出明亮的绿色荧光。这种…

triton矩阵乘以及缓存优化

这里triton.cdiv(M, META[BLOCK_SIZE_M]) * triton.cdiv(N, META[BLOCK_SIZE_N])&#xff0c;所以grid的形状是一维的。 观察函数内部 pid tl.program_id(axis0)&#xff0c;因为grid是一维的&#xff0c;所以这里就是总块数&#xff0c;我们假设实际A*BC&#xff0c; A&…

ubuntu链接mysql

C链接mysql 报错 sudo apt-get update sudo apt-get install libmysqlclient-dev 指令编译 g -o mysql_example mysql_example.cpp -I/usr/include/mysql -lmysqlclient g mysql_test.cpp mysql_config --cflags --libs 安装mysql sudo apt updatesudo apt install mysql-…

跟着ChatGPT4o学全栈,我看到未来“学习”的模样

引言 大模型是否会取代人类&#xff0c;以及它将取代哪些工作&#xff0c;这或许是许多人焦虑的问题。对此&#xff0c;众说纷纭&#xff0c;网络上各种观点层出不穷。虽然这些问题对未来的重要性不容忽视&#xff0c;但它们对于当下的我们缺少实际的指导意义。因此&#xff0…

SpringMVC系列十一: 文件上传与自定义拦截器

文章目录 SpringMVC文件上传基本介绍需求分析 / 图解应用实例-代码实现 自定义拦截器什么是拦截器自定义拦截器执行流程分析图自定义拦截器应用实例快速入门注意事项和细节Debug执行流程 多个拦截器多个拦截器执行流程示意图应用实例1代码实现注意事项和细节 应用实例2 作业布置…

[创业之路-118] :制造业企业的必备管理神器-ERP-制造业的基本方程式与ERP的发展历程,哪些企业需要ERP?

目录 一、制造业的基本方程式 1.1 基本方程式 1.2 制造的数学模型 二、ERP的发展历程 2.1 发展历程 2.2 比较 三、过往产品回顾 3.1 定货点法 3.2 时段式ERP 3.3 闭环式MRP 3.4 ERP 四、哪些企业需要ERP 4.1 概述 4.2 软件企业需要ERP吗&#xff1f; 一、制造业的…

【计算机网络篇】数据链路层(6)共享式以太网_网络适配器_MAC地址

文章目录 &#x1f354;网络适配器&#x1f354;MAC地址&#x1f5d2;️IEEE 802局域网的MAC地址格式&#x1f4d2;IEEE 802局域网的MAC地址发送顺序&#x1f95a;单播MAC地址&#x1f95a;广播MAC地址&#x1f95a;多播MAC地址&#x1f50e;小结 &#x1f354;网络适配器 要将…

汇川h3U用modbus配置扩展IO

扩展IO模块为4个艾莫迅RTU简易版&#xff0c;16输入&#xff0c;16输出。物理连接为RS485&#xff0c;A B两根线。 下面为H3Umodbus配置&#xff0c;关键是协议选择为&#xff1a;MODBUS主站配置。协议配置&#xff1a;和从站保持一致 通过下图的程序及配置&#xff0c;已经可…

VB打开word文档

在编码之前&#xff0c;先安装Microsoft.Office.Interop.Word Imports Microsoft.Office.InteropModule Module1Sub Main() 创建Word应用程序实例Dim wordApp As New Word.Application() 设置为可见wordApp.Visible True 打开指定的Word文档Dim doc As Word.Document wordA…