当前位置: 首页 > article >正文

list的常见接口使用

今天,我们来讲解一下C++关于STL标准库中的一个容器list的常见接口。

在我们之前c语言数据结构中,我们已经了解过了关于链表的知识点了,那么对于现在理解它也是相对来说比较容易的了。

数据结构--双向循环链表-CSDN博客 

1. 定义与包含头文件

- 首先要包含 <list> 头文件才能使用 list 容器。例如: #include <list> 。
- 定义一个 list 容器的基本语法是 std::list<数据类型> 列表名; 。

比如 std::list<int> myList; 就定义了一个存储整数的 list 容器。

 2. 特点

https://cplusplus.com/reference/list/

1- 双向链表结构: list 在内部是通过双向链表实现的。这意味着每个元素(节点)都包含指向前一个元素后一个元素的指针。这种结构使得在序列中的任何位置进行插入和删除操作都非常高效,时间复杂度为常数时间O(1),因为不需要移动其他元素,只需要调整节点间的指针。
2- 元素存储:元素在内存中不是连续存储的,与数组(如 std::vector )不同。这使得 list 可以高效地进行插入和删除操作,但随机访问元素的效率较低,访问第n个元素的时间复杂度为O(n)。

3- list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。

list的接口比较多,这里也是讲解比较常用的接口,其余的到时候需要再去官网查询即可

一:list的构造 

explicit list (size_type n, const value_type& val = value_type())
构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list

ps:解释explicit

explit:用于防止隐式转换。在没有 explicit 关键字修饰构造函数时,编译器可以使用单参数构造函数(或者除第一个参数外其余参数都有默认值的多参数构造函数)进行隐式转换。而 explicit 关键字就是用来禁止这种隐式转换的。

好处:

- 可以提高代码的可读性和安全性。通过禁止隐式转换,代码的意图更加明确,减少了一些可能由于意外的隐式转换而导致的错误。同时,在需要进行类型转换时,显式的转换也能让阅读代码的人清楚地知道发生了什么操作。

其中,在vector中,我们解释了为啥要弄成val=T()? 同样在list中也是类似的!

 代码演示:下面以int类型为演示,当然也可以改成string,char等等。

void TestList1()
{构造空的lt1list<int> lt1;  lt2中放4个值为100的元素list<int> lt2(4, 100); 用lt2的[begin(), end())左闭右开的区间构造lt3list<int> lt3(lt2.begin(), lt2.end()); 用lt3拷贝构造lt4
list<int> lt4(lt3);                    以数组为迭代器区间构造lt5int array[] = { 16,2,77,29 };list<int> l5(array, array + sizeof(array) / sizeof(int));列表格式初始化C++11list<int> l6{ 1,2,3,4,5 };用迭代器方式打印lt5中的元素list<int>::iterator it = l5.begin();while (it != l5.end()){cout << *it << " ";++it;}       cout << endl;C++11范围for的方式遍历for (auto& e : l5)cout << e << " ";cout << endl;
}

list iterator迭代器的使用

1.begin和end

2.rbegin和rend

我们在vector和string中知道迭代器的使用了:(其实都是一样的) 


正向迭代器:迭代器执行++操作,迭代器向后移动
反向迭代器:迭代器执行++操作,迭代器向前移动
 

代码演示: 

**注意:***链表遍历只能使用迭代器或者范围for:因为它是不连续的*****

void PrintList(const list<int>& l)
{***注意这里调用的是list的 begin() const,返回list的const_iterator对象for (list<int>::const_iterator it = l.begin(); it != l.end(); ++it){cout << *it << " ";// *it = 10; 编译不通过,因为const不能够修改}
void TestList2()
{int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };list<int> l(array, array + sizeof(array) / sizeof(array[0]));// 使用正向迭代器正向list中的元素// list<int>::iterator it = l.begin();   // C++98中语法auto it = l.begin();                     // C++11之后推荐写法while (it != l.end()){cout << *it << " ";++it;}cout << endl;// 使用反向迭代器逆向打印list中的元素// list<int>::reverse_iterator rit = l.rbegin();auto rit = l.rbegin();while (rit != l.rend()){cout << *rit << " ";++rit;}cout << endl;
}

Capacity容量

函数声明接口说明
empty检测list是否为空,是返回true,否则返回false
size返回list中有效节点的个数

Element access元素访问:

函数声明接口说明
front返回list的第一个节点中值的引用
back返回list的最后一个节点中值的引用

list modifiers链表的修改

函数声明接口说明
push_front在list首元素前插入值为val的元素

pop_front

删除list中第一个元素
 

push_back

在list尾部插入值为val的元素

pop_back

删除list中最后一个元素
insert在list position 位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素
 

assign

追加新的内容到list中
void TestList3()
{int array[] = { 1, 2, 3 };list<int> L(array, array + sizeof(array) / sizeof(array[0]));// 在list的尾部插入4,头部插入0L.push_back(4);L.push_front(0);PrintList(L);// 删除list尾部节点和头部节点L.pop_back();L.pop_front();PrintList(L);
}
void TestList4()
{int array1[] = { 1, 2, 3 };list<int> L(array1, array1 + sizeof(array1) / sizeof(array1[0]));// 获取链表中第二个节点auto pos = ++L.begin();cout << *pos << endl;// 在pos前插入值为4的元素L.insert(pos, 4);PrintList(L);// 在pos前插入5个值为5的元素L.insert(pos, 5, 5);PrintList(L);// 在pos前插入[v.begin(), v.end)区间中的元素vector<int> v{ 7, 8, 9 };L.insert(pos, v.begin(), v.end());PrintList(L);// 删除pos位置上的元素L.erase(pos);PrintList(L);// 删除list中[begin, end)区间中的元素,即删除list中的所有元素L.erase(L.begin(), L.end());PrintList(L);
}
void TestList5()
{// 用数组来构造listint array1[] = { 1, 2, 3 };list<int> l1(array1, array1 + sizeof(array1) / sizeof(array1[0]));PrintList(l1);// 交换l1和l2中的元素list<int> l2;l1.swap(l2);PrintList(l1);PrintList(l2);// 将l2中的元素清空l2.clear();cout << l2.size() << endl;
}

区分迭代器的性质:

1.迭代器的性质有底层的结构决定。

 

我们可以看到,上面的函数模板的定义的迭代器不同,它们分别代表什么意思呢?

分别代表:

1. 单向迭代器:
 - 只能按照一个方向来遍历元素,通常是从容器的第一个元素开始,按顺序依次向后访问,不能往回走  eg:单链表

2.双向迭代器:

在单向迭代器的基础上增加了反向遍历的功能。可以向前也可以向后移动,能更灵活地访问元素。例如在处理双向链表数据结构时,双向迭代器可以方便地在链表中前后移动来查找或者操作节点。 eg:list,map(以后学),set(以后学)

3. 随机迭代器:
它的功能更强大,不仅可以像双向迭代器那样前后移动,还能够直接跳转到容器中的任意一个合法位置访问元素,就像知道每个元素的“地址”一样,可以随意访问。比如对于一个数组,随机迭代器可以直接通过索引定位并访问元素,在需要随机访问数据的场景下,如对内存中的数据块进行抽样检查,随机迭代器就能发挥优势。

eg:vector,string,deque(后面讲优先队列时讲解)

迭代器失效问题:

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

好了,list的常见使用接口的讲解就到这结束了,希望你我共进步!

最后,鸡汤环节:

共勉!

相关文章:

list的常见接口使用

今天&#xff0c;我们来讲解一下C关于STL标准库中的一个容器list的常见接口。 在我们之前c语言数据结构中&#xff0c;我们已经了解过了关于链表的知识点了&#xff0c;那么对于现在理解它也是相对来说比较容易的了。 数据结构--双向循环链表-CSDN博客 1. 定义与包含头文件 …...

一维差分数组

2.一维差分 - 蓝桥云课 问题描述 给定一个长度为 n 的序列 a。 再给定 m 组操作&#xff0c;每次操作给定 3 个正整数 l, r, d&#xff0c;表示对 a_{l} 到 a_{r} 中的所有数增加 d。 最终输出操作结束后的序列 a。 ​​Update​​: 由于评测机过快&#xff0c;n, m 于 20…...

再次重拾jmeter之踩坑

1.添加“csv数据文件设置”&#xff0c;运行时提示 java.lang.IllegalArgumentException: Filename must not be null or empty检查多次后才发现因为我运行的是整个线程组&#xff0c;所以对应http请求下不能包括空的csv文件 2. 填写ip时不能加/&#xff0c;要在路径里加&…...

Flink的 RecordWriter 数据通道 详解

本文从基础原理到代码层面逐步解释 Flink 的RecordWriter 数据通道&#xff0c;尽量让初学者也能理解。 1. 什么是 RecordWriter&#xff1f; 通俗理解 RecordWriter 是 Flink 中负责将数据从一个任务&#xff08;Task&#xff09;发送到下游任务的组件。想象一下&#xff0c;…...

4-6记录(B树)

找左边右下或者右边左下 转化成了前驱后继的删除 又分好几种情况&#xff1a; 1. 只剩25&#xff0c;小于2&#xff0c;所以把父亲拉到25旁边&#xff0c;兄弟的70顶替父亲 对于25&#xff0c;25的后继就是70&#xff0c;25后继的后继是71&#xff08;中序遍历) 2. 借左子树…...

06软件测试需求分析案例-添加用户

给职业顾问部的老师添加用户密码后&#xff0c;他们才能登录使用该软件。只有admin账户具有添加用户、修改用户信息、删除用户的权利。admin是经理或团队的第一个人的账号&#xff0c;后面招一个教师就添加一个账号。 通读需求是提取信息&#xff0c;提出问题&#xff0c;输出…...

Nacos服务发现和配置管理

目录 一、Nacos概述 1. Nacos 简介 2. Nacos 特性 2.1 服务发现与健康监测 2.2 动态配置管理 2.3 动态DNS服务 2.4 其他关键特性 二、 服务注册和发现 2.1 核心概念 2.2 Nacos注册中心 2.3 Nacos单机模式 2.4 案例——服务注册与发现 2.4.1 父工程 2.4.2 order-p…...

【KWDB 创作者计划】第一卷:基础架构篇

以下是KWDB技术白皮书第一卷&#xff1a;基础架构篇的完整内容展示&#xff0c;包含要求的三个核心章节的深度解析。我们将以技术严谨性结合可读性的方式呈现&#xff0c;实际交付时会进一步扩展示意图和代码示例。 目录 ​KWDB技术白皮书卷一&#xff1a;基础架构篇 ​1. 数…...

对接日本金融市场数据全指南:K线、实时行情与IPO新股

一、日本金融市场特色与数据价值 日本作为全球第三大经济体&#xff0c;其金融市场具有以下显著特点&#xff1a; 成熟稳定&#xff1a;日经225指数包含日本顶级蓝筹股独特交易时段&#xff1a;上午9:00-11:30&#xff0c;下午12:30-15:00&#xff08;JST&#xff09;高流动性…...

【愚公系列】《高效使用DeepSeek》066-纠纷解决话术

🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...

操作系统 3.1-内存使用和分段

如何简单使用内存 这张幻灯片展示了计算机如何开始执行程序的基本过程&#xff0c;涉及到存储器、指令寄存器&#xff08;IR&#xff09;、运算器和控制器等计算机组件。 存储器&#xff1a;程序被加载到内存中。图中显示了一个指令 mov ax, [100]&#xff0c;它的作用是将内存…...

禅道MCP Server开发实践与功能全解析

一、简介 1、MCP Server核心定义 MCP Server&#xff08;Meta Command Protocol Server&#xff09;是一种基于客户端-服务器架构的轻量级服务程序&#xff0c;采用统一的mcp协议格式&#xff0c;通过连接多样化数据源和工具为AI应用提供扩展能力。它作为中间层&#xff0c;实…...

Spring Boot 3.5新特性解析:自动配置再升级,微服务开发更高效

&#x1f4dd; 摘要 Spring Boot 3.5作为Spring生态的最新版本&#xff0c;带来了多项令人振奋的改进。本文将深入解析其中最核心的自动配置增强特性&#xff0c;以及它们如何显著提升微服务开发效率。通过详细的代码示例和通俗易懂的讲解&#xff0c;您将全面了解这些新特性在…...

GNSS静态数据处理

1 安装数据处理软件&#xff1a;仪器之星&#xff08;InStar &#xff09;和 Trimble Business Center 做完控制点静态后&#xff0c;我们需要下载GNSS数据&#xff0c;对静态数据进行处理。在处理之前需要将相关软件在自己电脑上安装好&#xff1a; 仪器之星&#xff08;InS…...

java家政APP源码,家政预约平台源码,家电上门维修、家电上门清洗

家政上门预约服务APP源码&#xff0c;开发功能涵盖了用户注册与登录、家政服务分类与选择、预约管理、支付与交易、地图与导航、评价与反馈、个人信息管理、消息通知、营销工具以及数据分析等多个方面。这些功能的实现不仅提高了家政服务的便捷性和效率&#xff0c;还为用户提供…...

LangGraph 架构详解

核心架构组件 LangGraph 的架构建立在一个灵活的基于图的系统上&#xff0c;使开发者能够定义和执行复杂的工作流。以下是主要架构组件&#xff1a; 1. 状态管理系统 LangGraph 的核心是其强大的状态管理系统&#xff0c;它允许应用程序在整个执行过程中维护一致的状态&…...

【LLM基础】Megatron-LM相关知识(主要是张量并行机制)

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了Megatron-LM的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Megatron-LM相关材料进行的&#xff0c;每个知识点的修正和深入…...

动力电池自动点焊机:新能源汽车制造的智能焊接利器

在新能源汽车产业蓬勃发展的今天&#xff0c;动力电池作为其核心部件&#xff0c;其性能与安全性直接关系到整车的续航里程和使用寿命。而动力电池的制造过程中&#xff0c;焊接工艺是至关重要的一环。这时&#xff0c;动力电池自动点焊机便以其高效、精准、智能的特点&#xf…...

解决vcpkg使用VS2022报错问题

转自个人博客&#xff1a;解决vcpkg使用VS2022报错问题 最近&#xff0c;在把Visual Studio2019完全更新到最新Visual Studio2022后&#xff0c;原使用的vcpkg无法正常安装包&#xff0c;会报如下与Visual Studio 2022相关的错误&#xff1a; error: in triplet x64-windows-m…...

Next.js 简介

Next.js 是一个由 Vercel 开发的基于 React 的 Web 开发框架&#xff0c;旨在简化 React 应用的开发流程&#xff0c;提供更好的性能和开发体验。 &#x1f31f; Next.js 的核心特点 1. 文件系统路由&#xff08;File-system Routing&#xff09; 在 pages/ 目录中创建文件就…...

一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速

在Ubuntu系统下安装FFmpeg有多种方式,其中最常用的是通过apt-get命令和源码编译安装。本文将分别介绍这两种方式,并提供安装过程。 一、apt-get安装 使用apt-get命令安装FFmpeg是最简单快捷的方式,只需要在终端中输入以下命令即可: # 更新软件包列表 sudo apt-get updat…...

MySQL逻辑架构有什么?

1. MySQL逻辑架构分层 MySQL的逻辑架构可分为三层&#xff08;自上而下&#xff09;&#xff1a; 连接层&#xff08;Client Layer&#xff09;服务层&#xff08;Server Layer&#xff09;存储引擎层&#xff08;Storage Engine Layer&#xff09; -----------------------…...

AI应用企业研发方案

一、引言 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度融入各个行业&#xff0c;推动着企业的创新与变革。对于医药流通行业批发公司而言&#xff0c;面对日益激烈的市场竞争和不断变化的客户需求&#xff0c;借助AI技术提升企业的…...

【15】Strongswan watcher详解2

watcher的核心业务函数watch&#xff1a; &#xff08;1&#xff09;如果count为0&#xff0c;没有要监听的句柄&#xff0c;则watcher状态设置为WATCHER_STOPPED&#xff0c;返回&#xff0c;返回值为JOB_REQUEUE_NONE&#xff0c;这会返回到“【11】Strongswan processor 详解…...

linux shell编程之条件语句(二)

目录 一. 条件测试操作 1. 文件测试 2. 整数值比较 3. 字符串比较 4. 逻辑测试 二. if 条件语句 1. if 语句的结构 (1) 单分支 if 语句 (2) 双分支 if 语句 (3) 多分支 if 语句 2. if 语句应用示例 (1) 单分支 if 语句应用 (2) 双分支 if 语句应用 (3) 多分支 …...

uniapp uni-collapse动态切换数据时高度不能自适应

需单独调用方法更新 this.$nextTick(() > {if (this.$refs.collapseBox) {this.$refs.collapseBox.resize()} })...

递归?递推?

前言&#xff1a;递归、递推是两种非常常见基础的算法了&#xff0c;但我之前忘了从这基础的先讲起了&#xff0c;大家应该也都略有了解吧&#xff01;今天突然想写点相关延伸内容&#xff0c;所以还是完整介绍一些吧 递归 递归是一种通过函数调用自身解决问题的算法。在递归…...

蓝桥杯--结束

冲刺题单 基础 一、简单模拟&#xff08;循环数组日期进制&#xff09; &#xff08;一&#xff09;日期模拟 知识点 1.把月份写为数组&#xff0c;二月默认为28天。 2.写一个判断闰年的方法&#xff0c;然后循环年份的时候判断并更新二月的天数 3.对于星期数的计算&#…...

【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)

文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…...

Android-应用签名

1 需求 Android 支持以下三种应用签名方案&#xff1a; v1 方案&#xff1a;基于 JAR 签名。v2 方案&#xff1a;APK 签名方案 v2&#xff08;在 Android 7.0 中引入&#xff09;。v3 方案&#xff1a;APK 签名方案 v3&#xff08;在 Android 9 中引入&#xff09;。v4 方案&…...