C++初阶(十五)--STL--list 的深度解析与全面应用

文章目录

一、头文件与基本概念

二、构造函数和析构函数

1.构造函数

2.析构函数

三、元素访问

front

back

四、迭代器相关函数

begin

end

rebegin(反向迭代器)

rend(反向迭代器)

五、容量相关函数

empty

size

max_size

六、修改器

assign

push_front 

push_back

pop_front

pop_back 

insert 

erase 

swap

clear

resize

七、操作

merge 

splice

remove

remove_if

reserve 

sort

unique

emplace函数(C++11及以上)

八、非成员函数重载

1.比较运算符重载(==、!=、<、<=、>、>=)

2.swap 函数(非成员函数重载)


C++ 的标准模板库(STL)中的 list 是一个功能强大且灵活的双向链表容器,它提供了众多接口函数来满足各种编程需求。在本篇博客中,我们将深入探讨 list 的所有成员函数,包括一些相对不太常用但在特定场景下非常有用的函数,我们这里只探讨基本的使用,不探讨底层原理,下一篇博客,我们将会模拟实现list。

一、头文件与基本概念

要使用list容器,首先需要包含<list>头文件,并引入std命名空间,使得我们可以直接使用list而不是std::list

#include <iostream>
#include <list>
using namespace std;

list 作为双向链表容器,其每个节点包含数据以及指向前一个节点和后一个节点的指针,这使得它在插入和删除操作上具有独特的优势,但在随机访问方面相对较弱。

二、构造函数和析构函数

1.构造函数

默认构造函数:创建一个空的list容器

list<int> myList1;

填充构造函数:构造一个含有n个val的某类型容器。

	list<int> myList2(10, 2);

初始化列表构造函数:使用给定的初始化列表来初始化list

list<int> myList3 = { 1, 2, 3, 4, 5 };

拷贝构造函数:用另一个同类型的 list 容器来初始化新的 list

list<int> myList4(myList1);

范围构造函数:依据其他容器(如数组、vector 等)中指定范围的元素构建 list。例如,假设有数组 int arr[] = {6, 7, 8, 9, 10};

list<int> myList4(arr, arr + 5);

移动构造函数(C++11及以上):允许将一个临时 list 资源转移到新创建的 list 中,以提高性能。例如:

list<int> createTempList()
{list<int> temp = { 11, 12, 13 };return temp;
}list<int> myList6 = createTempList();  // 使用移动构造函数初始化 myList6

2.析构函数

当 list 容器对象超出作用域或被显式删除时,析构函数会自动被调用,释放链表中每个节点所占用的内存资源,确保内存不会泄漏。

三、元素访问

front

作用:返回list容器中的第一个元素

cout << "第一个元素: " << myList2.front() << endl;

back

作用:返回list容器中的最后一个元素

cout << "最后一个元素: " << myList2.back() << endl;

四、迭代器相关函数

begin

返回指向list容器中第一个元素的正向迭代器,通过这个迭代器可以顺序遍历容器中的元素

list<int>::iterator itBegin = myList2.begin();

end

返回指向list容器中最后一个元素之后位置的正向迭代器,用于标记整形遍历的结束。

list<int>::iterator itEnd = myList2.end();

rebegin(反向迭代器)

返回指向list容器中最后一个元素的反向迭代器,可用于从后向前遍历容器

list<int>::reverse_iterator itRBegin = myList2.rbegin();

rend(反向迭代器)

返回指向list容器中第一个元素之前位置的反向迭代器,标记反向遍历的结束。

list<int>::reverse_iterator itREnd = myList2.rend();

五、容量相关函数

empty

检查list容器是否为空,为空时返回true,否则返回false。

if (myList1.empty()) {cout << "myList1 为空" << endl;
} else {cout << "myList1 不为空" << endl;
}

size

返回list容器中当前元素的数量。

cout << "myList2 的元素个数: " << myList2.size() << endl;

max_size

返回list容器理论上能够容纳的最大元素数量,这个数量通常取决于系统资源和实现细节。

cout << "myList2 最大可容纳元素数: " << myList2.max_size() << endl;

六、修改器

assign

使用新的元素替换list容器中的所有现有元素。

myList2.assign(3, 100);  // 将 myList2 中的元素替换为 3 个 100

也可以使用一个范围的元素来进行替换,假设存在另一个list: list<int> otherList = {200,300,400};

list<int> otherList = { 200,300,400 };
myList1.assign(otherList.begin(), otherList.end());

push_front 

在list容器的头部插入一个新元素。

myList2.push_front(0);

push_back

在list容器的尾部插入一个新元素。

myList.push_back(6);

pop_front

移除 list 容器头部的元素。

myList2.pop_front();

pop_back 

移除 list 容器尾部的元素

myList2.pop_back();

insert 

在指定位置插入一个元素,列如,在myList2的第二个位置插入值为15的元素。

auto itInsertPos = myList2.begin();
++itInsertPos;
myList2.insert(itInsertPos, 15);

也可以一次性插入多个相同元素,如在myList的开头插入3个值为5的元素:

myList2.insert(myList2.begin(), 3, 5);

也可以插入一个范围的元素,假设有 vector<int> vec = {7,8,9}。

myList2.insert(myList2.end(), vec.begin(), vec.end());

erase 

移除指定位置的元素。列如,移除myList2中的第三个元素。

auto itErasePos = myList2.begin();
++itErasePos;
++itErasePos;
myList2.erase(itErasePos);

也可以移除一个范围的元素,如移除myList2中的第二个元素到第四个元素(不包括第四个)。

auto start = myList2.begin();
++start;
auto end = start;
++end;
++end;
myList2.erase(start, end);

swap

交换两个 list容器的内容

list<int> listA = {1, 2, 3};
list<int> listB = {4, 5, 6};
listA.swap(listB);

clear

移除list容器中的所有元素,使其变为空容器

myList2.clear();

resize

两种情况:

  1. 当所给值大于当前的size时,将size扩大到该值,扩大的数据为第二个所给值,若未给出,则默认为容器所存储类型的默认构造函数所构造出来的值。
  2. 当所给值小于当前的size时,将size缩小到该值。
myList1.resize(10);  // 将 myList1 大小调整为 10,新增元素使用默认值初始化myList1.resize(5);  // 将 myList1 大小调整为 5,移除后面的元素myList1.resize(8, 20);  // 将 myList1 大小调整为 8,新增元素值为 20

七、操作

merge 

将另一个已排序的 list 合并到当前 list 中,合并后当前 list 仍保持有序。假设 list<int> listC = {1, 3, 5}; 和 list<int> listD = {2, 4, 6};,且 listC 和 listD 都已排序。

listC.merge(listD);

splice

将另一个list中的一个或多个元素移动到当前list的指定位置,列如,将 listD 的所有元素移动到 listC 的开头。

listC.splice(listC.begin(), listD);

也可以移动指定位置的单个元素,假设有 list<int> listE = {10,20,30}。

auto itE = listE.begin();
++itE;
listC.splice(listC.begin(), listE, itE);

remove

移除list容器中所有与指定值相等的元素

myList2.remove(2);

remove_if

根据指定的谓词(函数或函数对象)移除满足条件的元素。例如,移除所有偶数元素。

list<int> listG = { 1, 2, 3, 4, 5, 6 };
listG.remove_if([](int x) { return x % 2 == 0; });//去除偶数

reserve 

反转list容器中元素的顺序

list<int> listH = {1, 2, 3, 4, 5};
listH.reverse();

sort

对 list 容器中的元素进行排序。默认按照升序排序,如果需要自定义排序规则,可以传入比较函数或函数对象。例如,按照降序排序,需要按照以下代码写。

list<int> listI = {5, 3, 4, 1, 2};
listI.sort(greater<int>());

unique

移除list容器中连续的重复元素,只保留一个。

list<int> listJ = {1, 1, 2, 2, 3, 3, 3, 4, 4};
listJ.unique();

emplace函数(C++11及以上)

在指定位置原地构造一个新元素,相比于 insert 函数,emplace 函数可以避免不必要的临时对象创建和复制,提高效率。例如,在 list 开头插入一个值为 100 的元素:

myList2.emplace(myList2.begin(), 100);

八、非成员函数重载

1.比较运算符重载==!=<<=>>=

可以直接比较两个 list 容器是否相等或确定它们的大小关系,比较基于元素的逐对比较。例如:

list<int> listK = {1, 2, 3};
list<int> listL = {1, 2, 3};
if (listK == listL) {cout << "listK 和 listL 相等" << endl;
}

2.swap 函数(非成员函数重载)

提供了一种更方便的方式来交换两个 list 容器的内容,与成员函数 swap 功能相同,但调用方式略有不同。

list<int> listM = {4, 5, 6};
list<int> listN = {7, 8, 9};
swap(listM, listN);

 

本篇博客到此结束,欢迎评论区留言~


本篇博客参考资料网址:cplusplus.com

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个关于 CSS Modules 的陷阱

我在引用 less 文件样式的时候&#xff0c;发现 index.less .drag_upload {width: 100%;height: 90vh;padding: 20px; }index.jsx import React, { useState, useEffect } from react; import styles from ./index.less;export default ({ }) > {return (<div classNa…

基于STM32的智能家居电器控制系统

目录 引言环境准备 2.1 硬件准备 2.2 软件准备智能家居电器控制系统基础 3.1 控制系统架构 3.2 功能描述代码实现&#xff1a;实现智能家居电器控制系统 4.1 数据采集模块 4.2 控制逻辑与设备管理 4.3 通信与远程控制实现 4.4 用户界面与数据可视化应用场景&#xff1a;家庭自…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

vue3【实战】响应式的登录界面

效果预览 WEB 端效果 移动端效果 技术方案 vue3 vite Element Plus VueRouter UnoCSS TS vueUse AutoImport 技术要点 响应式设计 移动端&#xff1a;图片切换为绝对定位&#xff0c;下移一层&#xff0c;成为背景图片 <el-imageclass"w-screen h-screen lt-md…

c语言的qsort函数理解与使用

介绍&#xff1a;qsort 函数是 C 标准库中用于排序的快速排序算法函数。它的用法非常灵活&#xff0c;可以对任意类型的元素进行排序&#xff0c;只要提供了比较函数即可。 qsort 函数原型及参数解释&#xff1a; void qsort ( void* base, //指向要排序的数组的首元素…

AIGC学习笔记(6)——AI大模型开发工程师

文章目录 AI大模型开发工程师005 OpenAI大模型案例实践1 AI 翻译助手需求分析项目起源市场价格和市场前景基于大模型的翻译软件核心功能设计 2 AI 翻译助手架构设计架构设计代码结构设计 3 AI 翻译助手核心功能文档解析文档操作PDF文档操作表格操作图片操作 Prompt封装 4 AI 翻…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程

微信小程序全局配置:导航栏、下拉刷新与上拉触底设置教程 引言 微信小程序作为一种新兴的轻量级应用,凭借其便捷性和丰富的功能受到了广泛的欢迎。在开发小程序的过程中,合理配置全局属性是提升用户体验的关键。本文将深入探讨小程序的全局配置中的window选项,重点介绍导…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

【C++笔记】数据结构进阶之二叉搜索树(BSTree)

【C笔记】数据结构进阶之二叉搜索树(BSTree) &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】数据结构进阶之二叉搜索树(BSTree)前言一.二叉搜索树的概念二.二叉搜索树的性能分析三.二叉搜索树的实现3.1二叉树的中序…

无线图传下的低延迟视频传输播放技术探讨

技术背景 无线图传技术即无线图像传输技术&#xff0c;是指不用布线&#xff08;线缆&#xff09;利用无线电波来传输图像数据的技术。 一、工作原理 无线图传技术主要涉及图像采集、编码、调制、发射、接收、解调、解码和图像显示等环节。 图像采集&#xff1a;通过摄像头…

Linux的开发工具(三)

条件编译 预处理本质&#xff1a;对代码进行裁剪 像网易云音乐有vip和普通用户&#xff0c;可以通过条件编译来&#xff0c;这样只用写一份代码&#xff0c;也只用维护一份代码&#xff0c;是vip就走vip代码&#xff0c;不是就普通用户代码&#xff0c;条件编译来动态裁剪。 …

VSCode 汉化教程【简洁易懂】

VSCode【下载】【安装】【汉化】【配置C环境&#xff08;超快&#xff09;】&#xff08;Windows环境&#xff09;-CSDN博客 我们安装完成后默认是英文界面。 找到插件选项卡&#xff0c;搜索“Chinese”&#xff0c;找到简体&#xff08;更具你的需要&#xff09;&#xff08;…

Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成

Ubuntu下的DoxygenVScode实现C/C接口文档自动生成 1、 Doxygen简介 Doxygen 是一个由 C 编写的、开源的、跨平台的文档生成系统。最初主要用于生成 C 库的 API 文档&#xff0c;但目前又添加了对 C、C#、Java、Python、Fortran、PHP 等语言的支持。其从源代码中提取注释&…

Linux网络——网络层

网络层的作用&#xff1a;在复杂的网络环境中确定一个合适的路径。 一.IP协议 IP存在的意义&#xff1a;IP地址提供一种能力&#xff0c;使得数据能够从主机B跨网络、可靠的送至主机A。 1.协议头格式 能够看出IP协议的格式与TCP协议存在很多相似之处&#xff0c;同样拥有4为首…

Shiro-550反序列化漏洞分析

&#x1f338; 环境配置 代码下载地址&#xff1a;https://codeload.github.com/apache/shiro/zip/refs/tags/shiro-root-1.2.4 下载完成之后&#xff0c;需要修改一下pom文件&#xff1a; 修改一下红色框中的配置。然后配置一下tomcat&#xff1a; 点击部署&#xff0c;然后…

【Rhino】【Python】Create a series of Blocks according to Value of object Property

文章目录 1. Complete Code Display2. Detailed Code Analysis2.1 Import and Setup2.2 Function Structure and Initial Setup2.3 Object Collection and Filtering2.4 Story Management System2.5 Locating Point Processing2.6 Object Organization by Story2.7 Block Creat…

CSP/信奥赛C++语法基础刷题训练(23):洛谷P1217:[USACO1.5] 回文质数 Prime Palindromes

CSP/信奥赛C语法基础刷题训练&#xff08;23&#xff09;&#xff1a;洛谷P1217&#xff1a;[USACO1.5] 回文质数 Prime Palindromes 题目描述 因为 151 151 151 既是一个质数又是一个回文数&#xff08;从左到右和从右到左是看一样的&#xff09;&#xff0c;所以 151 151 …

【探寻密码的奥秘】-001:解开密码的神秘面纱

目录 1、密码学概述1.1、概念1.2、目的1.3、应用场景 2、密码学的历史2.1、第一时期&#xff1a;古代密码时代2.2、第二时期&#xff1a;机械密码时代2.3、第三时期&#xff1a;信息密码时代2.4、第四时期&#xff1a;现代密码时代 3、密码学的基本概念3.1、一般通信系统3.2、保…