【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怎么实现热…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...