# C++之STL整理(9)之list用法(创建、赋值、增删查改)详解

C++之STL整理(9)之list用法(创建、赋值、增删查改)详解

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的list用法整理

  • C++之STL整理(9)之list用法(创建、赋值、增删查改)详解
  • 一、 list 对象的创建
    • list 构造函数
      • 1.1 默认构造函数
      • 1.2 区间构造函数
      • 1.3 拷贝指定元素次数的构造函数
      • 1.4 拷贝构造函数
  • 二、list 数据元素的增删查改
    • 2.1 尾部插入元素
    • 2.2 删尾部元素
    • 2.3 开头插入元素
    • 2.4 删开头元素
    • 2.5 在指定位置插入元素
    • 2.6 在指定位置插入多个元素
    • 2.7 在指定位置插入区间元素
    • 2.8 清空所有元素
    • 2.9 删指定区间元素
    • 2.10 删指定位置元素
    • 2.11 删所有匹配元素
  • 三、 list 大小操作
    • 3.1 返回容器中元素的个数
    • 3.2 判断容器是否为空
    • 3.3 重新指定容器的长度为指定值(默认填充)
    • 3.4 重新指定容器的长度为指定值并指定填充值
  • 四、 list 赋值操作
    • 4.1 将区间中的数据拷贝赋值给本身
    • 4.2 将指定个数的元素拷贝赋值给本身
    • 4.3 重载等号操作符进行赋值
    • 4.4 交换两个 list 的元素
  • 五、 list 数据的存取
    • 5.1 返回第一个元素
    • 5.2 返回最后一个元素
  • 六、list 反转与排序
    • 6.1 反转链表
    • 6.2 对链表进行排序
  • 总结


提示:本文为 C++ 中 list构造、赋值、接口 的写法和举例


一、 list 对象的创建

  STL 中的std::list 是 C++ 标准模板库(STL)中的一种双向链表数据结构,可以任意位置高效插与删。它提供了许多操作来管理链表中的元素,如插、删、遍历等。以下是对 std::list 及其相关函数的详细解释,并给出每个函数的简单使用例子:

list 构造函数

1.1 默认构造函数

std::list<int> lst; // 创建一个空的 int 类型 list

1.2 区间构造函数

int arr[] = {1, 2, 3, 4, 5};  
std::list<int> lst(arr, arr + 5); // 创建一个包含数组元素的 list

1.3 拷贝指定元素次数的构造函数

std::list<int> lst(10, 5); // 创建一个包含 10 个 5 的 list

1.4 拷贝构造函数

std::list<int> lst1(10, 5);  
std::list<int> lst2(lst1); // 创建一个 lst1 的副本 lst2

二、list 数据元素的增删查改

2.1 尾部插入元素

std::list<int> lst;  
lst.push_back(1); // 在 lst 尾部插入元素 1

2.2 删尾部元素

lst.push_back(2); // lst 现在为 {1, 2}  
lst.pop_back(); // 删 lst 的最后一个元素,lst 现在为 {1}

2.3 开头插入元素

lst.push_front(0); // 在 lst 开头插入元素 0,lst 现在为 {0, 1}

2.4 删开头元素

lst.pop_front(); // 删 lst 的第一个元素,lst 现在为 {1}

2.5 在指定位置插入元素

std::list<int>::iterator it = lst.begin();  
lst.insert(it, 2); // 在 lst 的开头插入元素 2,lst 现在为 {2, 1}

2.6 在指定位置插入多个元素

lst.insert(lst.end(), 3, 3); // 在 lst 尾部插入 3 个元素 3,lst 现在为 {2, 1, 3, 3, 3}

2.7 在指定位置插入区间元素

std::list<int> lst2 = {4, 5, 6};  
lst.insert(lst.begin(), lst2.begin(), lst2.end()); // 在 lst 开头插入 lst2 的元素,lst 现在为 {4, 5, 6, 2, 1, 3, 3, 3}

2.8 清空所有元素

lst.clear(); // lst 现在是空的

2.9 删指定区间元素

lst.push_back(4); lst.push_back(5); lst.push_back(6); // lst 现在是 {4, 5, 6}  
lst.erase(lst.begin(), std::next(lst.begin(), 2)); // 删从开头到第二个元素之后的位置,lst 现在为 {6}

2.10 删指定位置元素

lst.push_back(7); // lst 现在是 {6, 7}  
lst.erase(std::prev(lst.end())); // 删最后一个元素之前的元素,lst 现在为 {7}

2.11 删所有匹配元素

lst.push_back(7); lst.push_back(7); // lst 现在是 {7, 7}  
lst.remove(7); // 删所有值为 7 的元素,lst 现在是空的

std::list 提供了丰富的操作来管理链表中的元素,这些操作都是高效的,因为 std::list 的节点存储了指向前后节点的指针,使得插入和删操作可以在常数时间内完成。在需要频繁进行插入和删操作的场景下,std::list 通常是一个很好的选择。

三、 list 大小操作

3.1 返回容器中元素的个数

std::list<int> lst = {1, 2, 3, 4, 5};  
std::size_t size = lst.size(); // size 为 5

3.2 判断容器是否为空

std::list<int> empty_lst;  
if (empty_lst.empty()) {  
    // 此代码块会被执行,因为 empty_lst 是空的  
}

3.3 重新指定容器的长度为指定值(默认填充)

std::list<int> lst = {1, 2, 3};  
lst.resize(5); // lst 现在为 {1, 2, 3, 默认值, 默认值}

3.4 重新指定容器的长度为指定值并指定填充值

std::list<int> lst = {1, 2, 3};  
lst.resize(5, 0); // lst 现在为 {1, 2, 3, 0, 0}

四、 list 赋值操作

4.1 将区间中的数据拷贝赋值给本身

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2;  
lst2.assign(lst1.begin(), lst1.end()); // lst2 现在为 {1, 2, 3}

4.2 将指定个数的元素拷贝赋值给本身

std::list<int> lst;  
lst.assign(3, 4); // lst 现在为 {4, 4, 4}

4.3 重载等号操作符进行赋值

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2;  
lst2 = lst1; // lst2 现在为 {1, 2, 3}

4.4 交换两个 list 的元素

std::list<int> lst1 = {1, 2, 3};  
std::list<int> lst2 = {4, 5, 6};  
lst1.swap(lst2); // lst1 现在为 {4, 5, 6},lst2 现在为 {1, 2, 3}

五、 list 数据的存取

5.1 返回第一个元素

std::list<int> lst = {1, 2, 3};  
int first_elem = lst.front(); // first_elem 为 1

5.2 返回最后一个元素

int last_elem = lst.back(); // last_elem 为 3

六、list 反转与排序

6.1 反转链表

std::list<int> lst = {1, 2, 3, 4, 5};  
lst.reverse(); // lst 现在为 {5, 4, 3, 2, 1}

6.2 对链表进行排序

std::list<int> lst = {5, 3, 1, 4, 2};  
lst.sort(); // lst 现在为 {1, 2, 3, 4, 5}

需要注意的是,std::list 的 sort 方法只适用于包含可比较元素的列表。对于自定义类型的元素,你需要提供比较函数或重载比较操作符,以便 sort 方法能够正确地对元素进行排序。

总结

std::list 的这些操作提供了灵活且高效的方式来管理链表结构的数据,使得在需要频繁进行插入和删除操作的场景中,std::list 成为一个非常合适的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/561120.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb--前端--02JavaScript

JavaScript 1 JavaScript介绍2 引入方式3 基础语法3.1 书写语法3.2 变量3.3 数据类型和运算符 4 JS的函数4.1函数的第一种定义4.2 函数的第二中定义 5 JavaScript对象5.1 基本对象5.1.1 Array对象5.1.2 String对象5.1.3 Json对象 5.2 BOM5.2.1 BOM对象5.2.1 Windows对象5.2.2 L…

c++补充

构造函数、析构函数 #include <iostream> using namespace std;// 构造函数、析构函数 // --- "构造函数"类比生活中的"出厂设置" --- // --- "析构函数"类比生活中的"销毁设置" --- // 如果我们不写这两种函数&#xff0c;编译…

定制k8s域名解析------CoreDns配置实验

定制k8s域名解析------CoreDns配置实验 1. 需求 k8s集群内通过CoreDns互相解析service名. 同时pana.cn域为外部dns解析,需要通过指定dns服务器进行解析 再有3个服务器,需要使用A记录进行解析 2. K8s外DNS服务器 查看解析文件 tail -3 /var/named/pana.cn.zone 解析内容 ww…

STM32G431RBT6之时钟树配置与生成工程

默认大家都下载了蓝桥杯嵌入式资源包了哈. 首先,打开cubumx,修改RCC与SYS. 打开并观察原理图,发现晶振是24Mhz. 第一步,打开Clock Configuration. 第二步,修改晶振为原理图相对应的24Mhz. 第三步,切换到HSE. 第四步,切换到PLLCLK. 第五步,设置HCLK为80Mhz(15届真题要求为8…

【信号处理】基于EEG脑电信号的自闭症预测典型方法实现

理论 自闭者主要受到遗传和环境因素的共同影响。由于自闭症是一种谱系障碍&#xff0c;因此每个自闭症患者都有独特的优势和挑战。自闭症患者学习、思考和解决问题的方式可以是高技能的&#xff0c;也可以是严峻的挑战。研究表明&#xff0c;高质量的早期干预可以改善学习、沟…

Java web应用性能分析之【MySQL安装注意事项】

本文主要是针对以前LAMP&#xff0c;以及默认用apt安装的mysql。数据文件、日志文件都在一起&#xff1b;innodb_buffer_pool默认用128M。如果你排查问题&#xff0c;最后发现是因为mysql的安装配置不对&#xff0c;是否一口老血要喷出来。同时给MySQL数据库安装做参考。 关于M…

ZYNQ NVME高速存储之EXT4文件系统

前面文章分析了高速存储的各种方案&#xff0c;目前主流的三种存储方案是&#xff0c;pcie switch高速存储方案&#xff0c;zynq高速存储方案&#xff0c;fpga高速存储方案。虽然三种高速存储方案都可以实现高速存储&#xff0c;但是fpga高速存储方案是最烂的&#xff0c;fpga…

23.组件注册方式

组件注册方式 一个 Vue 组件在使用前需要先被“注册”&#xff0c;这样 Vue 才能在渲染模板时找到其对应的实现。组件注册有两种方式&#xff1a;全局注册和局部注册 全局注册 import { createApp } from vue import App from ./App.vue import GlobalComponent from ".…

C++三大特性之一:继承

文章目录 前言一、继承方式二、继承类型继承中构造和析构的顺序继承中的内存分配多继承语法(非重点)继承中同名静态成员的处理继承一般在哪里用到进阶&#xff1a;菱形继承和虚拟继承 总结 前言 C三大特性&#xff1a;继承、多态和封装。继承是面向对象编程的一个核心概念&…

实在IDP文档审阅产品导引

实在IDP文档审阅&#xff1a;智能文档处理的革新者 一、引言 在数字化转型的浪潮中&#xff0c;文档处理的智能化成为企业提效的关键。实在智能科技有限公司推出的实在IDP文档审阅&#xff0c;是一款利用AI技术快速理解、处理文档的智能平台&#xff0c;旨在为企业打造专属的…

在PostgreSQL中如何进行全文搜索,以及如何优化全文搜索性能?

文章目录 如何进行全文搜索1. 创建全文搜索向量2. 执行全文搜索查询 如何优化全文搜索性能1. 使用GIN索引2. 限制搜索范围3. 优化文本处理4. 使用并发搜索5. 监控和调整配置 在PostgreSQL中&#xff0c;全文搜索通常通过使用tsvector和tsquery类型&#xff0c;以及to_tsvector和…

2024第十五届蓝桥杯 C/C++ B组 参赛经历分享(以及部分题解)

前言 emmmmmm&#xff0c;dp杯居然不考dp了&#xff0c;蓝桥一直没怎么出过的高精度居然也考了&#xff08;当时居然因为没太复习那块知识直接模拟混分了&#xff09;&#xff0c;题量也改了&#xff0c;总的来说反而简单了&#xff1f;。。。还好天津竞赛弱省&#xff0c;但愿…

使用HTML和CSS和PHP实现一个简单的简历制作项目

实 验 目 的 掌握HTML表单作用&#xff0c;以及action和method属性&#xff1b; 掌握HTML输入域作用、类型、标签&#xff0c;以及name和value属性&#xff1b; 掌握$_REQUEST变量的作用、语法和使用&#xff1b; 掌握注释&#xff0c;以及变量的作用、命名、赋值和输出&#…

交换机端口类型——操控vlan tag

拓扑图 按照上图vlan及端口类型&#xff0c;操控vlan标签&#xff0c;实现PC1、PC2、PC3互通。 配置 sysname SW1 # vlan 10 # interface GigabitEthernet0/0/1port link-type accessport default vlan 10 # interface GigabitEthernet0/0/24port link-type accessport defaul…

【新版】小剧场短剧影视小程序源码

风口项目 &#xff0c;短剧app 小程序 H5 多端程序 全网首家对接了易支付&#xff0c; 修复了众多BUG 目前已知BUG全部修复 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89070544 更多资源下载&#xff1a;关注我。

redhatcsa学习笔记--题目+答案

一、semanage命令 semanage命令 – 查询与修改安全上下文 semanage命令来自英文词组“SELinux manage”的缩写&#xff0c;其功能是用于查询与修改安全上下文。semanage的功能类似于chcon命令&#xff0c;它们都可以用于设置文件的SELinux安全上下文策略&#xff0c;而semana…

Linux内核之文件系统访问:目录项、inode、物理磁盘访问关系(五十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

(2022级)成都工业学院数据库原理及应用实验六: SQL DML(增、删、改)

写在前面 1、基于2022级软件工程/计算机科学与技术实验指导书 2、成品仅提供参考 3、如果成品不满足你的要求&#xff0c;请寻求其他的途径 运行环境 window11家庭版 Navicat Premium 16 Mysql 8.0.36 实验要求 在实验三的基础上完成下列查询&#xff1a; 1、在科室表…

C++ 速成

C 概述 c 融合了3中不同的编程方式&#xff1a; C语言代表的过程性语言C 在C语言基础上添加的类代表的面向对象语言C 模板支持的泛型编程 C 标准 一种描述C 的一些语法规则的代码准则 C11 C 应用 游戏 C 效率是一个很重要的原因&#xff0c;绝大部分游戏殷勤都是C写的 网…

【Java网络编程】网络编程中的基本概念及实现UDP、TCP客户端服务器程序

目录 一、什么是网络编程&#xff1f; 二、网络编程中的基本概念 1. 客户端和服务器 2. 请求和响应 三、Socket套接字 UDP数据报套接字编程 1. DatagramSocket 2. DatagramPacket 3. UDP回显客户端服务器程序 4. UDP字典客户端服务器程序 TCP流套接字编程 1. Serve…
最新文章