【c++】STL常用容器5—list容器
文章目录
- list基本概念
- list构造函数
- list赋值和交换
- list大小操作
- list插入和删除
- list数据存取
- list反转和排序
list基本概念
功能:将数据进行链式存储。
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。
链表的组成:链表由一系列结点组成。
结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

STL中的链表是一个双向循环链表。

优点:
1、采用动态存储分配,不会造成内存浪费和溢出;
2、链表执行插入和删除操作十分方便,修改指针即可,不需要移动大量元素。
缺点:
链表灵活,但是空间(指针域)和时间(遍历)额外耗费较大。
list有一个重要的性质,插入操作和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的。
list构造函数
作用:创建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>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test()
{//创建list容器list<int> L1;//默认构造//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历容器printList(L1);//区间方式构造list<int>L2(L1.begin(), L1.end());printList(L2);//拷贝构造list<int>L3(L2);printList(L3);//n个elemlist<int>L4(10, 100);printList(L4);
}int main()
{test();system("pause");return 0;
}
总结:list构造方式同其它几个STL常用容器。
list赋值和交换
作用:给list容器进行赋值,以及交换list容器。
赋值函数原型:
assign(beg,end);//将[beg,end)区间中的数据考别赋值给本身
assign(n,elem);//将n个elem拷贝赋值给本身
交换函数原型:
list& operator=(const list& lst);//重载等号操作符
swap(list);//将list与本身的元素交换
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}//赋值
void test01()
{//创建list容器list<int> L1;//默认构造//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历容器printList(L1);list<int> L2;L2 = L1;//operator=赋值printList(L2);list<int> L3;L3.assign(L2.begin(), L2.end());printList(L3);list<int> L4;L4.assign(5, 100);printList(L4);
}//交换
void test02()
{list<int> L1;L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);list<int> L2;L2.assign(5, 100);cout << "交换前:" << endl;printList(L1);printList(L2);L1.swap(L2);cout << "交换前:" << endl;printList(L1);printList(L2);
}int main()
{test01();test02();system("pause");return 0;
}
list大小操作
作用:对list容器的大小进行操作。
函数原型:
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(num);//重新指定容器的长度为num,若容器变长,则以默认填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
resize(num,elem);//重新指定容器的长度num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}//赋值
void test01()
{//创建list容器list<int> L1;//添加数据L1.push_back(10);L1.push_back(20);L1.push_back(30);L1.push_back(40);//遍历容器printList(L1);//判断容器是否为空if (L1.empty()){cout << "L1为空" << endl;}else{cout << "L1不为空" << endl;cout << "L1的元素个数为:" << L1.size() << endl;//4}//重新指定大小L1.resize(10, 9);printList(L1);//10 20 30 40 9 9 9 9 9 9L1.resize(2);printList(L1);//10 20
}int main()
{test01();system("pause");return 0;
}
总结:
判断是否为空 — empty
返回元素个数 — size
重新指定个数 — resize
list插入和删除
作用:对list容器进行数据的插入和删除。
插入函数原型:
push_back(elem);//在容器尾部加入一个元素
push_front(elem);//在容器开头插入一个元素
insert(pos,elem);//在pos位置插入elem元素的拷贝,返回新数据的位置
insert(pos,n,elm);//在pos位置插入n个elem数据,无返回值
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值
删除函数原型:
pop_back();//删除容器中最后一个元素
pop_front();//删除容器中第一个元素
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置
erase(pos);//删除pos位置的数据,返回下一个数据的位置
remove(elem);//删除容器中所有与elem值匹配的元素
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{//创建list容器list<int> L;//尾插L.push_back(10);L.push_back(20);L.push_back(30);//头插L.push_front(1);L.push_front(2);L.push_front(3);//遍历容器printList(L);//3 2 1 10 20 30//尾删L.pop_back();printList(L);//3 2 1 10 20//头删L.pop_front();printList(L);//2 1 10 20//insert插入L.insert(L.begin(), 1000);printList(L);//1000 2 1 10 20list<int>::iterator it = L.begin();L.insert(++it, 2000);printList(L);//1000 2000 2 1 10 20//删除it = L.begin();L.erase(it);printList(L);//2000 2 1 10 20//移除L.push_back(10000);L.push_back(10000);printList(L);//2000 2 1 10 20 10000 10000L.remove(10000);printList(L);//2000 2 1 10 20//清空L.clear();printList(L);
}int main()
{test01();system("pause");return 0;
}
总结:
尾插 — push_back
头插 — push_front
插入 — insert
尾删 — pop_back
头删 — pop_front
删除 — remove
移除 — remove
清空 — clear
list数据存取
作用:对list容器中数据进行存取。
函数原型:
front();//返回第一个元素
back();//返回最后一个元素
list容器中不可以通过[]或者at方式访问数据
原因是list本质链表,不是用连续性空间存储数据,迭代器也是不支持随机访问的
#include<iostream>
using namespace std;
#include<list>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}void test01()
{list<int> L;L.push_back(10);L.push_back(20);L.push_back(30);L.push_back(40);//遍历容器printList(L);//L[0] 不可以用[]访问list容器中的元素//L.at(0) 不可用at方式访问list容器中的元素//原因是list本质链表,不是用连续性空间存储数据,迭代器也是不支持随机访问的//验证迭代器是不支持随机访问的list<int>::iterator it = L.begin();it++;//支持双向it--;//it = it + 1;//错误,不支持随机访问
}int main()
{test01();system("pause");return 0;
}
list反转和排序
作用:将容器中的元素反转,以及将容器中的数据进行排序。
函数原型:
reverse();//反转链表
sort();//链表排序
所有不支持随机访问迭代器的容器,不可以用标准算法;
不支持随机分迭代器的容器,内部会提供对应一些算法.
#include<iostream>
using namespace std;
#include<list>
#include<algorithm>void printList(const list<int>& L)
{for (list<int>::const_iterator it = L.begin(); it != L.end(); it++){cout << *it << " ";}cout << endl;
}//反转
void test01()
{list<int> L;L.push_back(10);L.push_back(70);L.push_back(50);L.push_back(30);//遍历容器cout << "反转前:" << endl;printList(L);//10 70 50 30//反转cout << "反转后:" << endl;L.reverse();printList(L);//30 50 70 10
}bool mycompare(int v1, int v2)
{//降序 就让第一个数大于第二个数return v1 > v2;
}//排序
void test02()
{list<int> L;L.push_back(10);L.push_back(70);L.push_back(50);L.push_back(30);//遍历容器cout << "排序前:" << endl;printList(L);//10 70 50 30//所有不支持随机访问迭代器的容器,不可以用标准算法//不支持随机分迭代器的容器,内部会提供对应一些算法//sort(L.begin(), L.end());L.sort();//默认排序规则 从小到大 升序cout << "排序后:" << endl;printList(L);L.sort(mycompare);//指定规则 从大到小 降序printList(L);
}int main()
{test01();test02();system("pause");return 0;
}
总结:
反转 — reverse
排序 — sort
相关文章:
【c++】STL常用容器5—list容器
文章目录list基本概念list构造函数list赋值和交换list大小操作list插入和删除list数据存取list反转和排序list基本概念 功能:将数据进行链式存储。 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链…...
【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)
前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录前言问题…...
聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT
今日要闻:苹果2024年放弃高通;腾讯回应进军类 ChatGPT;小米发布无线AR眼镜探索版;50%的美国企业已在使用ChatGPT;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙…...
Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障
在我之前的文章 “Elastic:开发者上手指南” 中的 “Ingest pipeline” 章节中个,我有很多文章是关于 ingest pipeline 的。在今天的文章中,我将重点介绍如何处理在摄取管道中的错误。在我之前的文章 “Elasticsearch:如何处理 in…...
指标体系—北极星指标体系
北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…...
【操作系统】内存管理
虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。…...
家庭消耗品跟踪管理软件HomeLists
什么是 HomeLists ? HomeLists 是一款自托管耗材统计软件,能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists ,选择第一个 aceberg/homelists,版本选择 latest。 本文写作时&…...
django模型简要(1)
1. AbstractUser(内置用户模型类)的使用 ### 需要在settings.py中添加如下: AUTH_USER_MODEL app.MyUser 说明:这是为了覆盖django默认的User model;app即模型所属app,MyUser即AbstractUser实现类。 2.on_delete选项 从django3.…...
【shell 编程大全】sed详解
sed详解1. 概述 今天单独拉出一章来讲述下sed命令。因为sed命令确实内容太多,不过也是比较灵活的,好了不废话了。我们开始吧 1.2 原理解析 shell脚本虽然功能很多,但是它最常用的功能还是处理文本文件,尤其是在正常的业务操作流程…...
关于sudo配置
前言这里做一个小补充,主要讲一下关于利用sudo对指令提权以及普通用户无法使用sudo指令的问题。在前面的文章【Linux】一文掌握Linux权限中,我们讲到了关于权限的一些问题。我们知道root身份下,一切畅通无阻,而权限只是用来限制我…...
EEGLAB处理运动想象脑电数据
最近在看论文时,经常看到作者处理数据的过程,之前都是一代而过,知道怎么处理就可以了,一直没有实践,最近需要一些特殊的数据,需要自己处理出来,这里尝试着自己用MATLAB处理数据,记录…...
span标签的使用场景
目录 前言 一、span标签是什么? 二、span常用 1.可以嵌套a标签。 2.直接使用 3.加样式使用 4.加按钮使用 5.加a标签的综合使用 6.跟table结合使用 总结 前言 本篇章主要记录一下开发日常中,所常遇见的使用span标签的场景。 一、span标签是什么…...
Kafka面试问题总结
kafka架构2.基础概念Producer(生产者) : 产生消息的一方。Consumer(消费者) : 消费消息的一方。Broker(代理) : 可以看作是一个独立的 Kafka 实例。多个 Kafka Broker 组成一个 Kafka Cluster。同时&#x…...
FPGA案例开发手册——基于全志T3+Logos FPGA核心板
前 言 本文档主要提供评估板FPGA端案例测试方法,适用的开发环境为Windows 7 64bit和Windows 10 64bit。 本文案例基于创龙科技的全志T3+Logos FPGA核心板,它是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计的异构多核全国产工业核心板…...
或许你想要的画图工具在这里
之前文章发布后,有小伙伴问下面的画怎么画的(偷偷告诉你,其实我是用铅笔水彩笔画的),哈哈,开玩笑了。其实这些图都是用Excalidraw 画出来的。 我们平常不管是工作中,还是在日常写文章&#x…...
2023年功能测试还值得入行吗?
前言 鉴于笔者从13年入行IT行业,经历了只有开发没有测试的阶段,经历了14年只要会基本的功能测试在一线就能薪资过万的阶段,经历了17年只要会一点自动化,会一点性能就能蒙骗过面试官的阶段,更经历了19年所有面试官对于…...
2022-2023山东大学机器学习期末回忆及复习建议
2023年第一次闭卷考试,让我们准备时都很无力,不知道试题究竟是什么难度,是否要掌握手推公式还有一些晦涩的知识点之类的,看到试题才发现其实闭卷也有好处,与往年题相比难度下降了不少。 一、名词解释 1、测试集 2、Boo…...
基于ssm框架实现家庭理财收支系统(源码+数据库+文档)
一、项目简介 本项目是一套基于ssm框架实现家庭理财收支系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,…...
MyBatis - 09 - 自定义映射resultMap
文章目录1 准备工作1.1 建表1.2 创建实体类1.3 引出一个问题方案1方案2方案32.完整代码项目结构EmpMapper接口Emp类SqlSessionUtils工具类EmpMapper.xmljdbc.propertieslog4j.xmlmybatis-config.xmlResultMapTest完整代码在后面 1 准备工作 1.1 建表 t_emp 添加测试数据&…...
springBoot常见面试题(2023最新)
目录前言1.谈谈你对springBoot的理解2.为什么使用springBoot或springBoot的优点3. springBoot与springCloud 区别4.springBoot的核心配置文件有哪些,作用是什么5.springBoot配置文件有几种类型,区别是什么6.什么是热部署?springBoot怎么实现热…...
智能内容解锁工具:5分钟掌握付费墙突破技巧
智能内容解锁工具:5分钟掌握付费墙突破技巧 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字信息时代,优质内容常被付费墙阻隔,而bypass-payw…...
基于Coqui TTS的高质量语音合成实战:从模型部署到生产环境优化
最近在做一个需要语音播报功能的小项目,之前用的一些在线TTS服务,要么费用不低,要么音质和速度达不到要求。于是把目光投向了开源方案,一番折腾后,发现 Coqui TTS 真是个宝藏。它不仅音质好,支持的语言和声…...
STM32F103C8T6与HC05蓝牙模块实战:手机APP控制OLED显示(附完整代码)
STM32F103C8T6与HC05蓝牙模块实战:手机APP控制OLED显示(附完整代码) 1. 项目概述与硬件准备 在物联网终端设备交互场景中,蓝牙通信因其低功耗、低成本的特点成为短距离无线传输的理想选择。本项目基于STM32F103C8T6微控制器与HC05…...
从零到数据分析:用ClickHouse+DBeaver在Windows上复现一个电商用户行为查询
从零构建电商数据分析平台:Windows下ClickHouse与DBeaver实战指南 1. 为什么选择ClickHouse进行电商行为分析? 去年双十一期间,某头部电商平台通过实时分析用户点击流数据,在活动开始后30分钟内就调整了首页推荐策略,…...
避坑指南:三自由度机械臂DH参数建模与逆解求解的那些‘坑’(从理论到Matlab/Python验证)
三自由度机械臂运动学建模实战:从DH参数陷阱到逆解验证 机械臂运动学建模是机器人学中最基础却最容易踩坑的领域之一。很多工程师和学生在理论学习阶段看似掌握了DH参数法和正逆运动学推导,但一旦动手实践,总会遇到各种"诡异"的问题…...
3大核心功能让你的英雄联盟体验提升300%:League-Toolkit完全指南
3大核心功能让你的英雄联盟体验提升300%:League-Toolkit完全指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 引言…...
Vue.Draggable深度解析:源码实现与高级应用实战
Vue.Draggable深度解析:源码实现与高级应用实战 【免费下载链接】Vue.Draggable SortableJS/Vue.Draggable: Vue.Draggable 是 Sortable.js 的 Vue.js 封装组件,提供了拖放排序功能,可以在 Vue 应用中轻松实现列表元素的可拖拽重排。 项目地…...
从零到一:在本地CentOS环境完整部署yshop-drink扫码点餐系统的实战指南
1. 环境准备:从零搭建CentOS基础系统 第一次在本地部署yshop-drink扫码点餐系统时,我选择了CentOS 7.9作为基础环境。这个版本既稳定又兼容大多数现代软件包,特别适合作为生产环境使用。建议直接使用阿里云镜像站下载Minimal版本ISO文件&…...
Python实战:用Statsmodels搞定简单线性回归(附NO浓度预测案例)
Python实战:用Statsmodels搞定简单线性回归(附NO浓度预测案例) 在数据分析领域,线性回归是最基础却最实用的统计方法之一。无论你是市场分析师预测销售额,还是环境科学家研究污染物分布,掌握线性回归都能让…...
利用Charles实现请求与响应的动态修改:从基础到实战
1. Charles工具简介与基础配置 Charles是一款功能强大的网络抓包工具,它就像是你手机和电脑之间的"透明玻璃",能让你清清楚楚地看到所有进出的网络请求。我第一次接触Charles是在调试一个电商APP的支付接口时,当时遇到一个诡异的bu…...
