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

C++STL序列式容器——list容器及其常用操作(详解)

在这里插入图片描述
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。

💬文章目录

    • 一.list容器基本概念
    • 二.list容器的常用操作
      • list构造函数
      • list迭代器获取
      • list特性操作
      • list元素操作
      • list赋值操作
      • list的交换、反转、排序、归并操作
      • list比较操作
      • list插入和删除操作

一.list容器基本概念

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:

  • 一个是存储数据元素的数据域。
  • 另一个是存储下一个结点地址的指针域。
    在这里插入图片描述

list容器的数据结构是一个有头双向循环链表。链表其优缺点为:

  • 采用动态存储分配,不会造成内存浪费和溢出
  • 链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素
  • 链表灵活,但是空间和时间额外耗费较大

list容器的迭代器:
list容器不能像vector一样以普通指针作为迭代器,因为其节点不能保证在同一块连续的内存空间上。list迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取操作。所谓”list正确的递增,递减、取值、成员取用”是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取的是节点的成员。由于list还是一个双向链表,迭代器必须能够具备前移、后移的能力,所以list容器提供的是双向迭代器(Bidirectional Iterators).
在这里插入图片描述

二.list容器的常用操作

list构造函数

注:使用list容器时,需包含头文件#include <list>

函数原型解释
list <T> lst;list采用模板实现类实现(显示实例化),对象的默认构造形式。
list(beg,end);构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);构造函数将n个elem拷贝给本身。
list(const list &lst);拷贝构造函数。

实例:构造函数演示

#include <iostream>
using namespace std;
#include <list>//包含头文件
void printList(const list<int>& mylist)//形参使用const,避免被修改
{//const_iterator只读迭代器for (list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it){cout << *it << " ";}cout << endl;
}
void test()
{list<char> mylist1;//list采用模板实现类实现(显示实例化),对象的默认构造形式。list<int> mylist2(10, 6); //构造函数将n个elem拷贝给本身。list<int> mylist3(++mylist2.begin(), --mylist2.end());//构造函数将[beg, end)区间中的元素拷贝给本身。list<int> mylist4(mylist2);//拷贝构造函数printList(mylist2);printList(mylist3);printList(mylist4);
}
int main()
{test();return 0;
}

在这里插入图片描述

list迭代器获取

函数原型解释
iterator begin();返回指向开始位置的迭代器,iterator是正向迭代器。只能使用++运算符从左向右遍历容器,每次沿容器向右移动一个元素
const_iterator begin();返回指向开始位置并且为常量的迭代器
const_iterator cbegin();返回指向开始并且为常量的迭代器,const_iterator 常正向迭代器。函数作用:配合auto使用
iterator end();返回指向末尾元素的下一个位置的迭代器
const_iterator end();返回指向末尾元素的下一个位置并且为常量的迭代器
const_iterator cend();返回指向末尾元素的下一个位置的并且为常量的迭代器,函数作用:配合auto使用
reverse_iterator rbegin();返回反向迭代器,指向末尾元素下一个位置,操作都是往相反反向,reverse_iterator 为反向迭代器
const_reverse_iterator crbegin();返回反向迭代器,指向末尾元素下一个位置,操作都是往相反反向,并且为常量属性,const_reverse_iterator 常反向迭代器。
reverse_iterator rend();返回反向迭代器,指向开头元素的位置,操作都是往相反反向
const_reverse_iterator cre nd();返回反向迭代器,指向开头元素的位置,操作都是往相反反向,并且为常量属性

注意:begin函数和cbegin函数都可以返回const_iterator,那么为什么要两个函数呢?
因为begin函数有重载,无法配合auto(自动推导数据类型)使用,所以才多出一个cbegin函数。

list特性操作

函数原型解释
size_t size() const;返回容器的实际大小(已使用的空间)。
bool empty() const;判断容器是否为空。
void clear();清空容器。
void resize(size_t size);把容器的实际大小置为size,如果size<实际大小,会截断多出的部分;如果size>实际大小,则以默认值0填充新位置
void resize(size_t size,const T &value);把容器的实际大小置为size,如果size<实际大小,会截断多出的部分;如果size>实际大小,就用value填充。

实例:特性函数演示

#include <iostream>
using namespace std;
#include <list>//包含头文件
void printList(const list<int>& mylist)//形参使用const,避免被修改
{//const_iterator只读迭代器for (list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it){cout << *it << " ";}cout << endl;
}
void test()
{list<int> mylist;for (int i = 0; i < 5; i++){mylist.push_back(i + 1);}cout << "size:" << mylist.size() << endl;//5cout << mylist.empty() << endl;//0if (mylist.empty()){cout << "空" << endl;}else{cout << "不为空" << endl;}mylist.resize(3);printList(mylist);//1 2 3mylist.resize(5);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。printList(mylist);//1 2 3 0 0mylist .resize(10, 6);//如果容器变长,也可以用value填充printList(mylist);//1 2 3 0 0 6 6 6 6 6 
}
int main()
{test();return 0;
}

在这里插入图片描述

list元素操作

函数原型解释
T& front();返回第一个元素。
T& back();返回最后一个元素。

list赋值操作

作用:通过重载赋值运算符operator=和成员函数assign(),给已存在的容器赋值,将覆盖容器中原有的内容。

函数原型解释
list assign(beg, end);将[beg, end)区间中的数据拷贝赋值给本身。
void assign(const size_t n, const T& value);将n个elem拷贝赋值给本身。
list& operator=(const list &lst);重载等号操作符,把容器l赋值给当前容器。

实例:赋值操作演示

#include <iostream>
using namespace std;
#include <list>//包含头文件
#include<algorithm>
void printList(const list<int>& mylist)//形参使用const,避免被修改
{//const_iterator只读迭代器for (list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it){cout << *it << " ";}cout << endl;
}void test()
{list<int> mylist;mylist.assign(10, 10);printList(mylist);list<int> mylist2;mylist2.assign(mylist.begin()++, mylist.end()--);printList(mylist2);cout << mylist.front() << endl;cout << mylist.back() << endl;
}
int main()
{test();return 0;
}

在这里插入图片描述

list的交换、反转、排序、归并操作

函数原型解释
void swap(list<T> &l);把当前容器与l交换,交换的是链表结点的地址。
void reverse();反转链表。
void sort();对容器中的元素进行升序排序。
void sort(_Pr2 _Pred);对容器中的元素进行排序,排序的方法由_Pred决定(二元函数)。
void merge(list< T> &l);采用归并法合并两个已排序的list容器,合并后的list容器仍是有序的。

实例:list的交换、反转、排序、归并操作演示

#include <iostream>
using namespace std;
#include <list>//包含头文件
#include<algorithm>
void printList(const list<int>& mylist)//形参使用const,避免被修改
{//const_iterator只读迭代器for (list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it){cout << *it << " ";}cout << endl;
}
bool myfunc2(int v1, int v2)
{return v1 > v2;
}
void test()
{list<int> mylist;for (int i = 0; i < 5; i++){mylist.push_back(i + 10);//10 11 12 13 14}list<int> mylist2;for (int i = 0; i < 5; i++){mylist2.push_back(i);//0 1 2 3 4}mylist2.swap(mylist); //把当前容器mylist2与mylist交换,交换的是链表结点的地址。printList(mylist2);//10 11 12 13 14mylist2.reverse();//反转链表printList(mylist2);//14 13 12 11 10//注意:list容器不能使用sort算法,list容器有自己专属的sort成员函数//sort(mylist.begin(), mylist.end());mylist2.sort(myfunc2);//借助myfunc2函数进行比较,然后sort降序排列printList(mylist2);//14 13 12 11 10mylist2.sort();//mylist2链表使用sort函数默认升序排列printList(mylist2);//10 11 12 13 14mylist.sort();//mylist链表使用sort函数默认升序排列printList(mylist);//0 1 2 3 4 mylist2.merge(mylist); //采用归并法合并两个已排序的list容器,合并后的list容器仍是有序的printList(mylist2); //0 1 2 3 4 10 11 12 13 14}
int main()
{test();return 0;
}

在这里插入图片描述

list比较操作

函数原型解释
bool operator == (const vector<T> & l) const;重载==运算符,判断当前链表与l是否相等
bool operator != (const vector<T> & l) const;重载!=运算符,判断当前链表与l是否不相等

list插入和删除操作

函数原型解释
void push_front(const T& ele);在容器头部插入一个数据
void push_back(const T& ele);尾部插入元素ele
void pop_front();删除容器第一个数据
void pop_back();删除最后一个元素
iterator insert(iterator pos, const T& value);在指定位置插入一个元素,返回指向插入元素的迭代器。
iterator insert(pos,n,elem);在pos位置插入n个elem数据,返回指向第一个插入元素的迭代器。
iterator insert(iterator pos, iterator first, iterator last);在指定位置插入一个区间的元素,返回指向第一个插入元素的迭代器。
iterator erase(iterator pos);删除指定位置的元素,返回下一个有效的迭代器。
iterator erase(iterator first, iterator last);删除指定区间的元素,返回下一个有效的迭代器。
splice(iterator pos, const vector< T> & l);把另一个链表连接到当前链表pos位置处。
splice(iterator pos, const vector< T> & l, iterator first, iterator last);把另一个链表指定的区间连接到当前链表pos位置处。
splice(iterator pos, const vector< T> & l, iterator first);把另一个链表从first开始的结点连接到当前链表pos位置处。
void remove(const T& value);删除链表中所有值等于value的元素。
void remove_if(_Pr1 _Pred);删除链表中满足条件的元素,参数_Pred是一元函数。
void unique();删除链表中相邻的重复元素,只保留一个。

list插入和删除操作演示:

#include <iostream>
using namespace std;
#include <vector>
#include <list>//包含头文件
void printList(const list<int>& mylist)//形参使用const,避免被修改
{//const_iterator只读迭代器for (list<int>::const_iterator it = mylist.begin(); it != mylist.end(); ++it){cout << *it << " ";}cout << endl;
}
bool myfunc(int val)
{return val > 300;
}
void test()
{list<int> mylist;mylist.push_back(10);//在容器尾部插入一个数据mylist.push_back(20);mylist.push_back(30);mylist.push_back(40);mylist.push_back(50);mylist.push_front(100);//在容器头部插入一个数据mylist.push_front(200);mylist.push_front(300);mylist.push_front(400);printList(mylist);//400 300 200 100 10 20 30 40 50cout << "------------------" << endl;list<int>::const_iterator it = mylist.insert(mylist.begin(), 2, 0);//在pos位置插入n个elem数据cout << *it << endl;//返回指向第一个插入元素的迭代器。cout << "------------------" << endl;vector<int> v;v.push_back(1000);v.push_back(2000);v.push_back(3000);mylist.insert(mylist.begin(), v.begin(), v.end()); //在指定位置插入一个区间的元素,返回指向第一个插入元素的迭代器printList(mylist);//1000 2000 3000 400 300 200 100 10 20 30 40 50cout << "------------------" << endl;mylist.erase(mylist.begin());//删除第一个元素printList(mylist); //2000 3000 400 300 200 100 10 20 30 40 50cout << "------------------" << endl;list<int> mylist2(6,6);mylist.splice(mylist.end(),mylist2);//将mylist2链接到mylist后printList(mylist);//2000 3000 400 300 200 100 10 20 30 40 50 6 6 6 6 6 6cout << "------------------" << endl;mylist.remove(300); //删除链表中所有值等于300的元素printList(mylist);//2000 3000 400 200 100 10 20 30 40 50 6 6 6 6 6 6cout << "------------------" << endl;mylist.remove_if(myfunc);//删除链表中所有值大于300的元素printList(mylist);// 200 100 10 20 30 40 50 6 6 6 6 6 6cout << "------------------" << endl;
}
int main()
{test();return 0;
}

在这里插入图片描述

相关文章:

C++STL序列式容器——list容器及其常用操作(详解)

纵有疾风起&#xff0c;人生不言弃。本文篇幅较长&#xff0c;如有错误请不吝赐教&#xff0c;感谢支持。 &#x1f4ac;文章目录 一.list容器基本概念二.list容器的常用操作list构造函数list迭代器获取list特性操作list元素操作list赋值操作list的交换、反转、排序、归并操作…...

【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)

一、前提准备 在Spring Boot中整合MyBatis时&#xff0c;你需要导入JDBC&#xff08;不需要手动添加&#xff09;和Druid的相关依赖。 JDBC依赖&#xff1a;在Spring Boot中整合MyBatis时&#xff0c;并不需要显式地添加JDBC的包依赖。这是因为&#xff0c;当你添加mybatis-sp…...

ChatGPT漫谈(三)

AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…...

树、二叉树(C语言版)详解

&#x1f355;博客主页&#xff1a;️自信不孤单 &#x1f36c;文章专栏&#xff1a;数据结构与算法 &#x1f35a;代码仓库&#xff1a;破浪晓梦 &#x1f36d;欢迎关注&#xff1a;欢迎大家点赞收藏关注 文章目录 &#x1f34a;树的概念及结构1. 树的概念2. 树的相关概念3.树…...

vue中Cascader 级联选择器实现-修改实现

vue 的cascader研究了好长时间&#xff0c;看了官网给的示例&#xff0c;上网查找了好多信息&#xff0c;才解决修改时回显的问题&#xff0c;现将方法总结如下&#xff1a; vue代码&#xff1a; <el-form-item label"芯片" prop"firmware"> <…...

C语言实现三子棋游戏

test.c源文件 - 三子棋游戏测试 game.h头文件 - 三子棋游戏函数的声明 game.c源文件 - 三子棋游戏函数的实现 主函数源文件&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1#include"game.h" //自己定义的用"" void menu() {printf("*************…...

机器学习深度学习——softmax回归从零开始实现

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——向量求导问题 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 …...

Windows如何安装Django及如何创建项目

目录 1、Windows安装Django--pip命令行 2、创建项目 2.1、终端创建项目 2.2、在Pycharm中创建项目 2.3、二者创建的项目有何不同 2.4、项目目录说明 1、Windows安装Django--pip命令行 安装Django有两种方式&#xff1a; pip命令行【推荐--简单】手动安装【稍微复杂一丢丢…...

在CSDN学Golang云原生(监控解决方案Prometheus)

一&#xff0c;记录规则配置 在golang云原生中&#xff0c;通常使用日志库记录应用程序的日志。其中比较常见的有logrus、zap等日志库。这些库一般支持自定义的输出格式和级别&#xff0c;可以根据需要进行配置。 对于云原生应用程序&#xff0c;我们通常会采用容器化技术将其…...

双重for循环优化

项目中有段代码逻辑是个双重for循环&#xff0c;发现数据量大的时候&#xff0c;直接导致数据接口响应超时&#xff0c;这里记录下不断优化的过程&#xff0c;算是抛砖引玉吧~ Talk is cheap,show me your code&#xff01; 双重for循环优化 1、数据准备2、原始双重for循环3、…...

golang利用go mod巧妙替换使用本地项目的包

问题 拉了两个项目下来&#xff0c;其中一个项目依赖另一个项目&#xff0c;因为改动了被依赖的项目&#xff0c;想重新导入测试一下。 解决办法 go.mod文件的require中想要被代替的包名在replace中进行一个替换&#xff0c;注意&#xff1a;用来替换的需要用绝对路径&#xf…...

使用 docker 一键部署 MySQL

目录 1. 前期准备 2. 导入镜像 3. 创建部署脚本文件 4. MySQL 服务器配置文件模板 5. 执行脚本创建容器 6. 后续工作 7. 基本维护 1. 前期准备 新部署前可以从仓库&#xff08;repository&#xff09;下载 MySQL 镜像&#xff0c;或者从已有部署中的镜像生成文件&#x…...

MyBatis-Plus 查询PostgreSQL数据库jsonb类型保持原格式

文章目录 前言数据库问题背景后端返回实体对象前端 实现后端返回List<Map<String, Object>>前端 前言 在这篇文章&#xff0c;我们保存了数据库的jsonb类型&#xff1a;MyBatis-Plus 实现PostgreSQL数据库jsonb类型的保存与查询 这篇文章介绍了模糊查询json/json…...

Linux操作系统1-命令篇

不同领域的主流操作系统 桌面操作系统 Windos Mac os Linux服务器操作系统 Unix Linux(免费、稳定、占有率高) Windows Server移动设备操作系统 Android(基于Linux,开源) ios嵌入式操作系统 Linux(机顶盒、路由器、交换机) Linux 特点&#xff1a;免费、开源、多用户、多任务…...

opencv-24 图像几何变换03-仿射-cv2.warpAffine()

什么是仿射&#xff1f; 仿射变换是指图像可以通过一系列的几何变换来实现平移、旋转等多种操作。该变换能够 保持图像的平直性和平行性。平直性是指图像经过仿射变换后&#xff0c;直线仍然是直线&#xff1b;平行性是指 图像在完成仿射变换后&#xff0c;平行线仍然是平行线。…...

前端常用的条件限制方法小笔记

手机号的正则表达式(以1开头的11位数字) function checkPhone(){ var phone document.getElementById(phone).value;if(!(/^1[3456789]\d{9}$/.test(phone))){ alert("手机号码有误&#xff0c;请重填"); return false; } }限制输入大于0且最小值要小于最大值 c…...

【LeetCode 算法】Minimum Operations to Halve Array Sum 将数组和减半的最少操作次数-Greedy

文章目录 Minimum Operations to Halve Array Sum 将数组和减半的最少操作次数问题描述&#xff1a;分析代码TLE优先队列 Tag Minimum Operations to Halve Array Sum 将数组和减半的最少操作次数 问题描述&#xff1a; 给你一个正整数数组 nums 。每一次操作中&#xff0c;你…...

Doc as Code (3):业内人士的观点

作者 | Anne-Sophie Lardet 在技术传播国际会议十周年之际&#xff0c;Fluid Topics 的认证技术传播者和功能顾问 Gaspard上台探讨了“docOps 作为实现Doc as Code的中间结构”的概念。在他的演讲中&#xff0c;观众提出了几个问题&#xff0c;我们想分享Gaspard的见解&#x…...

【Kafka】消息队列Kafka基础

目录 消息队列简介消息队列的应用场景异步处理系统解耦流量削峰日志处理 消息队列的两种模式点对点模式发布订阅模式 Kafka简介及应用场景Kafka比较其他MQ的优势Kafka目录结构搭建Kafka集群编写Kafka一键启动/关闭脚本 Kafka基础操作创建topic生产消息到Kafka从Kafka消费消息使…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...