【C++】STL中的list容器详解及常用函数用法

server/2024/11/14 4:39:43/

个人主页: 起名字真南的CSDN博客

个人专栏:

  • 【数据结构初阶】 📘 基础数据结构
  • 【C语言】 💻 C语言编程技巧
  • 【C++】 🚀 进阶C++
  • 【OJ题解】 📝 题解精讲

目录

  • 📌 1 引言
  • 📌2 list容器
    • ✨2.1 list容器简介
    • ✨2.2 list容器结构
  • 📌3 list中主要成员函数
    • ✨ 3.1 构造函数初始化list
    • ✨ 3.2 迭代器遍历list容器
    • ✨ 3.3 对list的空间进行操作
    • ✨ 3.4 对list的元素进行访问
    • ✨ 3.5 对list的元素进行修改
      • 🚀3.5.1 push and pop
      • 🚀3.5.2 insert and erase
      • 🚀 3.5.3 swap and clear
  • 4 📌 参考文件

📌 1 引言

在C++的表中模板库(STL)中,list容器提供了一个双向链表的实现,他能高效的在任意位置进行插入和删除元素,非常适合需要频繁修改数据的场景。与vector不同,list是一个双向链表结构,并不支持快速随机访问。本文将详细介绍list容器的特点,使用场景,以及其主要成员函数的用法。

list_20">📌2 list容器

list_21">✨2.1 list容器简介

在这里插入图片描述

list 容器简介list 是一个双向链表数据结构,具有以下特点:

  • 高效插入和删除:在已知位置插入或删除元素的时间复杂度为 O(1),远高于 vector 的 O(n)。
  • 不支持随机访问:与数组不同,list 不支持通过下标访问,因此需要通过迭代器进行遍历。
  • 双向链表:支持从头部和尾部同时遍历,方便实现一些特定算法。

list_30">✨2.2 list容器结构

std::list 使用双向链表实现,每一个节点都包含了两个指针和一个数据字段

  • 数据字段 :用于储存数据
  • 前驱指针 :指向当前节点的前一个节点
  • 后继指针:指向当前接的后一个指针

在这种结构下,list容器还有一个头节点,它的前一个指针对应着尾节点,后一个指针对应着头节点。

  • 头指针 :指向链表中的第一个节点
  • 尾指针 :指向链表的最后一个节点

在这里插入图片描述

list_44">📌3 list中主要成员函数

list_45">✨ 3.1 构造函数初始化list

构造函数接口说明
list (size_type n, const value_type& val = value_type())构造的list中包含n个值为val的元素
list()构造空的list
list (const list& x)拷贝构造函数
list (InputIterator first, InputIterator last)用[first, last)区间中的元素构造list
#include<iostream>
#include<list>using namespace std;int main()
{list<int> l1;list<int> l2(6, 6);list<int> l3(l2);int arr[] = { 1,2,3,4,5, };list<int> l4(arr, arr + sizeof(arr) / sizeof(arr[0]));return 0;
}

调试结果:
在这里插入图片描述

list_73">✨ 3.2 迭代器遍历list容器

函数声明接口说明
begin + end返回第一个元素的迭代器 + 返回最后一个元素下一个位置的迭代器
rbegin + rend返回第一个元素的 reverse_iterator,即 end 位置,返回最后一个元素下一个位置的 reverse_iterator,即 begin 位置
list<int>l1(8, 8);
//使用l1的迭代器构造l2
list<int>l2(l1.begin(), l1.end());
//列表格式初始化C++11
list<int>l3{ 1,2,3,4,5,6,7,8,9 };//使用迭代器的方式来遍历打印数组
int main()
{list<int>::iterator it = l1.begin();while (it != l1.end()){cout << *it << " ";it++;}cout << endl;for (auto au : l3){cout << au << " ";}cout << endl;auto l = l3.rbegin();while (l != l3.rend()){cout << *l << " ";l++;}cout << endl;return 0;
}

输出结果:
在这里插入图片描述
在这里插入图片描述
注意 :

  • 不管是使用正向迭代器还是反向迭代器,我们遍历的方法一直都是++控制。

list_119">✨ 3.3 对list的空间进行操作

在这里插入图片描述
在这里插入图片描述

函数声明接口说明
empty检测 list 是否为空,是返回 true,否则返回 false
size返回 list 中有效节点的个数
void test3()
{list<int> l1;list<int> l2(8,8);if (l1.empty()){cout << "l1 为空" << endl;}else{cout << "l1 不为空" << endl;}if (!(l2.empty())){cout << "l2 不为空" << endl;cout << "l2.size() : " << l2.size() << endl;}}

输出结果:
在这里插入图片描述
注意 :

  • 在这串代码中empty()的函数返回值是bool,如果为空则返回true,不为空返回false

list_157">✨ 3.4 对list的元素进行访问

在这里插入图片描述
在这里插入图片描述

函数声明接口说明
front返回 list 的第一个节点中值的引用
back返回 list 的最后一个节点中值的引用
void test4()
{list<int> l1{ 1,2,3,4,5,6,7,8,9,10 };cout << "l1.front(): " << l1.front() << endl;cout << "l1.back(): " << l1.back() << endl;
}

输出结果:
在这里插入图片描述
注意 :

  • list中不能随机访问链表中的元素,只能通过front和back来获取头结点的数据和尾节点的数据

list_182">✨ 3.5 对list的元素进行修改

函数声明接口说明
push_frontlist 首元素前插入值为 val 的元素
pop_front删除 list 中第一个元素
push_backlist 尾部插入值为 val 的元素
pop_back删除 list 中最后一个元素
insertlistposition 位置中插入值为 val 的元素
erase删除 listposition 位置的元素
swap交换两个 list 中的元素
clear清空 list 中的有效元素

🚀3.5.1 push and pop

在这里插入图片描述
在这里插入图片描述

在容器的开始位置插入元素
list容器的开始位置插入一个新的元素,在它当前的第一个元素之前将val的值移到第一个元素中。
增加一个容量。
在容器的末尾位置插入元素
list容器的开始位置插入一个新的元素,在它当前的第一个元素之前将val的值移到第一个元素中。
增加一个容量。

void test5()
{list<int> l1{ 1,2,3,4,5,6,7,8,9 };l1.push_front(0);l1.push_back(10);for (auto it : l1){cout << it << " ";}cout << endl;
}

输出结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

list中第一个元素删除,减少一个容量。
list中末尾元素删除,减少一个容量。

void test5()
{list<int> l1{ 1,2,3,4,5,6,7,8,9 };l1.push_front(0);l1.push_back(10);for (auto it : l1){cout << it << " ";}cout << endl;l1.pop_back();l1.pop_front();for (auto it : l1){cout << it << " ";}cout << endl;
}

输出结果:
在这里插入图片描述

🚀3.5.2 insert and erase

在这里插入图片描述

insert 在pos位置的数据前面插入一个数据
从图中我们可以看到传的参数可以是迭代器位置,也可以是一个迭代器区间

void test6()
{list<int> l1{0,1,2,3,5,6,7,8,9 };for (auto it : l1){cout << it << " ";}cout << endl;l1.insert(l1.begin(), 18);for (auto it : l1){cout << it << " ";}cout << endl;}

输出结果:
在这里插入图片描述

在这里插入图片描述

erase 将pos位置的数据删除
从图中可以看到参数可以是一个迭代器区间也可以是一个位置

void test6()
{list<int> l1{0,1,2,3,5,6,7,8,9 };for (auto it : l1){cout << it << " ";}cout << endl;l1.erase(--l1.end());for (auto it : l1){cout << it << " ";}cout << endl;}

输出结果:
在这里插入图片描述
注意 :

  • 在我们erase的时候需要注意关于迭代器失效的问题,在我们调用erase是必须保证他指向了一个有效的位置,如果代码中使用l1.erase(l1.end())在我们删除最后一个元素的时候他指向了最后一个数据的尾巴所以会造成迭代器失效

🚀 3.5.3 swap and clear

在这里插入图片描述

交换两个相同类型容器的元素

	for (auto it : l1){cout << it << " ";}cout << endl;list<int> l2(6, 6);for (auto it : l2){cout << it << " ";}cout << endl;swap(l1, l2);for (auto it : l1){cout << it << " ";}cout << endl;for (auto it : l2){cout << it << " ";}

输出结果:
在这里插入图片描述

在这里插入图片描述

清空list中所有有效元素

	l1.clear();l2.clear();

调试结果:
在这里插入图片描述

4 📌 参考文件

传送门: C++Reference



http://www.ppmy.cn/server/141013.html

相关文章

Hadoop生态圈框架部署(五)- Zookeeper完全分布式部署

文章目录 前言一、Zookeeper完全分布式部署&#xff08;手动部署&#xff09;1. 下载Zookeeper2. 上传安装包2. 解压zookeeper安装包3. 配置zookeeper配置文件3.1 创建 zoo.cfg 配置文件3.2 修改 zoo.cfg 配置文件3.3 创建数据持久化目录并创建myid文件 4. 虚拟机hadoop2安装并…

【大数据学习 | kafka高级部分】kafka的文件存储原理

在以上部分的讲解中我们知道了&#xff0c;kafka的使用场景就是在流式处理过程中&#xff0c;充当一个中间缓冲介质的作用&#xff0c;主要功能是将数据先放入到kafka中&#xff0c;计算框架会自己拉取要消费和计算的数据过来&#xff0c;采用poll的方式完全适配自身消费速率。…

微服务透传日志traceId

问题 在微服务架构中&#xff0c;一次业务执行完可能需要跨多个服务&#xff0c;这个时候&#xff0c;我们想看到业务完整的日志信息&#xff0c;就要从各个服务中获取&#xff0c;即便是使用了ELK把日志收集到一起&#xff0c;但如果不做处理&#xff0c;也是无法完整把一次业…

GeoHash处理经纬度,降维,空间填充曲线

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 参考 https://segmentfault.com/a/1190000042971576 GeoHash原理以及代码实现_geohash编码-CSDN博客…

NLP之ASR之moonshine:moonshine的简介、安装和使用方法、案例应用之详细攻略

NLP之ASR之moonshine&#xff1a;moonshine的简介、安装和使用方法、案例应用之详细攻略 目录 moonshine的简介 moonshine的安装和使用方法 1、安装 推荐使用uv管理Python环境 安装Moonshine包 Torch后端 TensorFlow后端 JAX后端 ONNX运行时 2、使用方法 0、测试 1…

Android下的系统调用 (syscall),内联汇编syscall

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 什么是系统调用 (syscall) 系统调用是操作系统提供给应用程序的一组接口&#xff0c;允许用户空间程序与内核进行交互。 在 Android&#xff08;基于 Linux …

华硕推出Intel Xeon 6/ Gaudi 3服务器 加速企业AI布局!

(10月23日&#xff0c;台北讯) 华硕服务器新品接力强势助攻&#xff0c;今再推出多款搭载Intel Xeon 6处理器的服务器&#xff0c;包括&#xff1a;多节点的ASUS RS920Q-E12&#xff0c;其兼容适用HPC运算的Intel Xeon 6900系列处理器&#xff1b;以及ASUS RS720Q-E12、RS720-E…

一篇文章解释AI中的“算力”与“数据”两个概念!

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、什么是算力?为什么算力重要?算力的发展历程什么是数据?数据的作用数据的应用场景算力与数据的关系总结前言 为什么我要特别讲这两个词呢?因为人工智能的核心其实就是三件事儿:算力、…