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

【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基本概念 功能&#xff1a;将数据进行链式存储。 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链…...

【牛客刷题专栏】0x0D:JZ5 替换空格(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转)&#xff0c;它登陆后会保存刷题记录进度&#xff0c;重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏&#xff1a;个人CSDN牛客刷题专栏。 题目来自&#xff1a;牛客/题库 / 在线编程 / 剑指offer&#xff1a; 目录前言问题…...

聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT

今日要闻&#xff1a;苹果2024年放弃高通&#xff1b;腾讯回应进军类 ChatGPT&#xff1b;小米发布无线AR眼镜探索版&#xff1b;50%的美国企业已在使用ChatGPT&#xff1b;Snap推出ChatGPT驱动的聊天机器人 苹果2024年放弃高通 高通公司 CEO 兼总裁克里斯蒂亚诺・安蒙&#xf…...

Elasticsearch:如何正确处理 Elasticsearch 摄取管道故障

在我之前的文章 “Elastic&#xff1a;开发者上手指南” 中的 “Ingest pipeline” 章节中个&#xff0c;我有很多文章是关于 ingest pipeline 的。在今天的文章中&#xff0c;我将重点介绍如何处理在摄取管道中的错误。在我之前的文章 “Elasticsearch&#xff1a;如何处理 in…...

指标体系—北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…...

【操作系统】内存管理

虚拟内存 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存&#xff0c;从而让程序获得更多的可用内存。 为了更好的管理内存&#xff0c;操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间&#xff0c;这个地址空间被分割成多个块&#xff0c;每一块称为一页。…...

家庭消耗品跟踪管理软件HomeLists

什么是 HomeLists &#xff1f; HomeLists 是一款自托管耗材统计软件&#xff0c;能通过提醒等帮助您跟踪家庭消耗品。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 homelists &#xff0c;选择第一个 aceberg/homelists&#xff0c;版本选择 latest。 本文写作时&…...

django模型简要(1)

1. AbstractUser(内置用户模型类)的使用 ### 需要在settings.py中添加如下&#xff1a; AUTH_USER_MODEL app.MyUser 说明&#xff1a;这是为了覆盖django默认的User model&#xff1b;app即模型所属app&#xff0c;MyUser即AbstractUser实现类。 2.on_delete选项 从django3.…...

【shell 编程大全】sed详解

sed详解1. 概述 今天单独拉出一章来讲述下sed命令。因为sed命令确实内容太多&#xff0c;不过也是比较灵活的&#xff0c;好了不废话了。我们开始吧 1.2 原理解析 shell脚本虽然功能很多&#xff0c;但是它最常用的功能还是处理文本文件&#xff0c;尤其是在正常的业务操作流程…...

关于sudo配置

前言这里做一个小补充&#xff0c;主要讲一下关于利用sudo对指令提权以及普通用户无法使用sudo指令的问题。在前面的文章【Linux】一文掌握Linux权限中&#xff0c;我们讲到了关于权限的一些问题。我们知道root身份下&#xff0c;一切畅通无阻&#xff0c;而权限只是用来限制我…...

EEGLAB处理运动想象脑电数据

最近在看论文时&#xff0c;经常看到作者处理数据的过程&#xff0c;之前都是一代而过&#xff0c;知道怎么处理就可以了&#xff0c;一直没有实践&#xff0c;最近需要一些特殊的数据&#xff0c;需要自己处理出来&#xff0c;这里尝试着自己用MATLAB处理数据&#xff0c;记录…...

span标签的使用场景

目录 前言 一、span标签是什么&#xff1f; 二、span常用 1.可以嵌套a标签。 2.直接使用 3.加样式使用 4.加按钮使用 5.加a标签的综合使用 6.跟table结合使用 总结 前言 本篇章主要记录一下开发日常中&#xff0c;所常遇见的使用span标签的场景。 一、span标签是什么…...

Kafka面试问题总结

kafka架构2.基础概念Producer&#xff08;生产者&#xff09; : 产生消息的一方。Consumer&#xff08;消费者&#xff09; : 消费消息的一方。Broker&#xff08;代理&#xff09; : 可以看作是一个独立的 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设计的异构多核全国产工业核心板…...

或许你想要的画图工具在这里

之前文章发布后&#xff0c;有小伙伴问下面的画怎么画的&#xff08;偷偷告诉你&#xff0c;其实我是用铅笔水彩笔画的&#xff09;&#xff0c;哈哈&#xff0c;开玩笑了。其实这些图都是用Excalidraw 画出来的。 我们平常不管是工作中&#xff0c;还是在日常写文章&#x…...

2023年功能测试还值得入行吗?

前言 鉴于笔者从13年入行IT行业&#xff0c;经历了只有开发没有测试的阶段&#xff0c;经历了14年只要会基本的功能测试在一线就能薪资过万的阶段&#xff0c;经历了17年只要会一点自动化&#xff0c;会一点性能就能蒙骗过面试官的阶段&#xff0c;更经历了19年所有面试官对于…...

2022-2023山东大学机器学习期末回忆及复习建议

2023年第一次闭卷考试&#xff0c;让我们准备时都很无力&#xff0c;不知道试题究竟是什么难度&#xff0c;是否要掌握手推公式还有一些晦涩的知识点之类的&#xff0c;看到试题才发现其实闭卷也有好处&#xff0c;与往年题相比难度下降了不少。 一、名词解释 1、测试集 2、Boo…...

基于ssm框架实现家庭理财收支系统(源码+数据库+文档)

一、项目简介 本项目是一套基于ssm框架实现家庭理财收支系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c…...

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的核心配置文件有哪些&#xff0c;作用是什么5.springBoot配置文件有几种类型&#xff0c;区别是什么6.什么是热部署&#xff1f;springBoot怎么实现热…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

鱼香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…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

es6+和css3新增的特性有哪些

一&#xff1a;ECMAScript 新特性&#xff08;ES6&#xff09; ES6 (2015) - 革命性更新 1&#xff0c;记住的方法&#xff0c;从一个方法里面用到了哪些技术 1&#xff0c;let /const块级作用域声明2&#xff0c;**默认参数**&#xff1a;函数参数可以设置默认值。3&#x…...

用递归算法解锁「子集」问题 —— LeetCode 78题解析

文章目录 一、题目介绍二、递归思路详解&#xff1a;从决策树开始理解三、解法一&#xff1a;二叉决策树 DFS四、解法二&#xff1a;组合式回溯写法&#xff08;推荐&#xff09;五、解法对比 递归算法是编程中一种非常强大且常见的思想&#xff0c;它能够优雅地解决很多复杂的…...