【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

.

💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注
在这里插入图片描述

文章目录

    • 一、初识list容器
      • 1.1 什么是list?
      • 1.2 核心特性
      • 1.3 典型应用场景
    • 二、核心成员函数
      • 2.1 默认成员函数
    • 三、迭代器操作
      • 3.1 基础迭代器
      • 3.2 常量迭代器(C++11)
    • 四、容量与访问操作
      • 4.1 容量查询
      • 4.2 元素访问
    • 五、修改操作详解
      • 5.1 基础修改函数
      • 5.2 高级修改操作
      • 5.3 插入与删除
        • insert重载版本
        • erase操作
    • 六、特殊成员函数
      • 6.1 条件操作
      • 6.2 链表特有操作
    • 七、总结与进阶

一、初识list容器

1.1 什么是list?

在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。
在这里插入图片描述

1.2 核心特性

  • 双向链表结构:每个元素包含指向前后节点的指针
  • 动态内存分配:元素按需分配内存
  • 高效插入删除:无需移动其他元素
  • 迭代器稳定性:插入删除操作不会使已有迭代器失效(除被删除元素)

1.3 典型应用场景

  • 需要频繁在首尾之外的位置插入/删除元素
  • 元素体积较大,避免vector扩容时的拷贝开销
  • 需要维护元素的插入顺序
  • 需要合并、拆分链表等特殊操作

二、核心成员函数

2.1 默认成员函数

在这里插入图片描述
构造函数的重载版本
在这里插入图片描述

函数功能描述示例
默认构造函数创建空listlist<int> lst1;
填充构造函数创建包含n个元素的listlist<char> lst2(5);
拷贝构造函数复制另一个list的内容list<int> lst3(lst2);
移动构造函数(C++11)转移另一个list的资源list<int> lst4(move(lst3));
析构函数自动释放内存(通常无需手动调用)lst1.~list();
拷贝赋值运算符深拷贝赋值操作lst2 = lst1;
移动赋值运算符(C++11)高效转移资源赋值操作lst3 = move(lst2);
// 初始化列表构造(C++11)
list<string> fruits {"apple", "banana", "cherry"};

三、迭代器操作

在这里插入图片描述

3.1 基础迭代器

函数功能示例
begin()返回指向第一个元素的迭代器auto it = lst.begin();
end()返回末尾哨兵迭代器while(it != lst.end())
rbegin()返回反向起始迭代器auto rit = lst.rbegin();
rend()返回反向结束迭代器for(; rit != lst.rend();)

3.2 常量迭代器(C++11)

函数功能示例
cbegin()返回不可修改的正向起始迭代器auto cit = lst.cbegin();
cend()返回不可修改的正向结束迭代器if(cit == lst.cend())
crbegin()返回不可修改的反向起始迭代器auto crit = lst.crbegin();
crend()返回不可修改的反向结束迭代器while(crit != lst.crend())
list<int> nums {1,2,3};
// 正向遍历
for(auto it = nums.begin(); it != nums.end(); ++it) {cout << *it << " ";  // 输出:1 2 3
}

四、容量与访问操作

在这里插入图片描述

4.1 容量查询

函数功能示例
size()返回元素数量if(lst.size() > 5)
empty()判断容器是否为空while(!lst.empty())

4.2 元素访问

函数功能示例
front()访问首元素(可修改)lst.front() = 10;
back()访问尾元素(可修改)cout << lst.back();
list<double> temps {36.5, 37.1, 38.0};
temps.front() = 35.9;  // 修改首元素
cout << "当前体温:" << temps.back();  // 输出38.0

五、修改操作详解

在这里插入图片描述

5.1 基础修改函数

函数功能示例
push_front(val)头部插入元素lst.push_front(0);
emplace_front(args)头部直接构造元素lst.emplace_front("test");
pop_front()删除头部元素lst.pop_front();
push_back(val)尾部插入元素lst.push_back(100);
emplace_back(args)尾部直接构造元素lst.emplace_back(1,2);
pop_back()删除尾部元素lst.pop_back();
clear()清空所有元素lst.clear();

push_back vs emplace_back

class Student {
public:Student(int id, string name) : id(id), name(name) {}
private:int id;string name;
};list<Student> roster;
roster.push_back(Student(101, "Alice"));  // 构造临时对象+拷贝
roster.emplace_back(102, "Bob");         // 直接构造(高效)

5.2 高级修改操作

函数功能示例
assign(n, val)用n个val替换内容lst.assign(5, 0);
assign(beg, end)用迭代器范围替换内容lst.assign(vec.begin(), vec.end());
swap(other)交换两个list的内容lst1.swap(lst2);
resize(n)调整元素数量lst.resize(10);
resize(n, val)调整数量并用val填充新增元素lst.resize(15, -1);
list<int> nums;
nums.assign({1,2,3});       // 内容变为[1,2,3]
nums.resize(5);             // 变为[1,2,3,0,0]
nums.resize(3);             // 截断为[1,2,3]

5.3 插入与删除

insert重载版本
iterator insert(iterator pos, const T& val);  // 单元素插入
void insert(iterator pos, size_t n, const T& val); // 批量插入
void insert(iterator pos, InputIt first, InputIt last); // 范围插入
erase操作
iterator erase(iterator pos);                 // 删除单个元素
iterator erase(iterator first, iterator last); // 删除区间元素

示例

list<int> data {10,20,30};
auto it = data.begin();
advance(it, 1);data.insert(it, 15);        // [10,15,20,30]
data.insert(it, 2, 18);     // [10,15,18,18,20,30]
vector<int> tmp {25,35};
data.insert(data.end(), tmp.begin(), tmp.end()); // 末尾追加data.erase(it);             // 删除第二个18

六、特殊成员函数

在这里插入图片描述

6.1 条件操作

函数功能示例
remove(val)删除所有等于val的元素lst.remove(5);
remove_if(pred)删除满足条件的元素lst.remove_if([](int n){ return n%2==0; });
list<int> nums {1,2,3,2,5};
nums.remove(2);  // 删除所有2 → [1,3,5]
nums.remove_if([](int x){ return x>3; }); // → [1,3]

6.2 链表特有操作

函数功能示例
unique()删除连续重复元素lst.unique();
merge(other)合并有序链表lst1.merge(lst2);
sort()排序元素(升序)lst.sort();
splice(pos, other)转移另一个链表的元素lst1.splice(it, lst2);
list<int> a {1,3,5}, b {2,4,6};
a.merge(b);       // a变为[1,2,3,4,5,6], b为空
a.sort();         // 排序(若未有序)list<int> x {10,20}, y {30,40};
auto pos = x.begin();
x.splice(pos, y); // x变为[30,40,10,20], y为空

七、总结与进阶

本文详细介绍了C++ list容器的基本特性和使用方法。通过大量的代码示例,我们学习了如何正确使用list进行元素的增删改查操作。list作为STL中重要的序列式容器,其独特的链表结构使其在特定场景下具有不可替代的优势。

在接下来的系列文章中,我们将深入探讨:

  • list的高级应用技巧
  • list在实际项目中的最佳实践案例

下篇预告:《【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘》,我们将通过剖析STL源码实现,带你理解list的底层工作机制

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

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

相关文章

labelimg快捷键

一、核心标注快捷键 ‌W‌&#xff1a;调出标注十字架&#xff0c;开始绘制矩形框&#xff08;最常用功能&#xff09;‌A/D‌&#xff1a;切换上一张(A)或下一张(D)图片&#xff0c;实现快速导航‌Del‌&#xff1a;删除当前选中的标注框 二、文件操作快捷键 ‌CtrlS‌&…

linux-文件操作

在 Linux 系统中&#xff0c;文件操作与管理是日常使用和系统管理的重要组成部分。下面将详细介绍文件的复制、移动、链接创建&#xff0c;以及文件查找、文本处理、排序、权限管理等相关知识。 一、文件的复制 在 Linux 里&#xff0c;cp 命令可用于复制文件或目录&#xff…

C++ 复习

VS 修改 C 语言标准 右键项目-属性 输入输出 //引用头文件&#xff0c;用<>包裹起来的一般是系统提供的写好的代码 编译器会在专门的系统路径中去进行查找 #include <iostream> //自己写的代码文件一般都用""包裹起来 编译器会在当前文件所在的目录中査…

openGauss新特性 | HTAP新特性介绍

一、行列融合功能简介 HTAP 行列融合特性在单机、主备场景下&#xff0c;通过节点的行列双格式内存模式&#xff0c;实现openGauss HTAP一体化数据库架构。 通过高效的行列转换技术方案&#xff0c;节点读取磁盘行存数据&#xff0c;生成列存储单元&#xff08;Column Unit&am…

双目测量中的将视差图重投影成三维坐标图

双目测距主要步骤如下&#xff1a; 左右两张图片 → 匹配 → 得到视差图 disp&#xff1b; 使用 cv2.reprojectImageTo3D(disp, Q) 将视差图 重投影 成三维坐标图 → 得到 points_3d 什么是 points_3d&#xff1f; points_3d cv2.reprojectImageTo3D(disp, Q)points_3d.shap…

《深度剖析:SOAP与REST,API集成的两极选择》

API作为不同系统之间交互的桥梁&#xff0c;其设计与实现的优劣直接影响着整个软件生态的运转效率。而在API的设计领域&#xff0c;SOAP和REST犹如两座巍峨的山峰&#xff0c;各自代表着截然不同的设计理念与应用方向&#xff0c;成为开发者在构建API时必须慎重权衡的关键选项。…

非对称加密算法(RSA、ECC、SM2)——密码学基础

对称加密算法&#xff08;AES、ChaCha20和SM4&#xff09;Python实现——密码学基础(Python出现No module named “Crypto” 解决方案) 这篇的续篇&#xff0c;因此实践部分少些&#xff1b; 文章目录 一、非对称加密算法基础二、RSA算法2.1 RSA原理与数学基础2.2 RSA密钥长度…

Pillow 玩图术:轻松获取图片尺寸和颜色模式

前言 在这个“图像为王”的时代,谁还敢说自己没被一张图折磨过?一张图片不讲武德,说崩就崩,说卡就卡,仿佛像素里藏着程序员的眼泪。不管你是网页设计师、AI炼丹师,还是只是想把猫片修得像艺术品,图片的尺寸和颜色模式都是你必须掌握的第一手情报。如果你不知道它有多宽…

下载core5compat 模块时,被禁止,显示 - servese replied: Forbbidden. -->换镜像源

怎么解决&#xff1f; --->换镜像源 方法 1&#xff1a;使用命令行参数指定镜像源 在运行 Qt 安装器时&#xff0c;通过 --mirror 参数指定镜像源&#xff1a; # Windows qt-unified-windows-x64-online.exe --mirror https://mirrors.ustc.edu.cn/qtproject# Linux/macO…

WPF中Behaviors

行为的好处 可以把复杂的界面逻辑抽象出去&#xff0c;让xaml的界面设计更简单&#xff0c;更清爽 1.安装包 Microsoft.Xaml.Behaviors.Wpf2.简单实现拖动效果 <Border Width"100"Height"100"Background"Red"><i:Interaction.Behav…

GitHub 趋势日报 (2025年05月03日)

本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ &#x1f4c8; 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1hacksider/Deep-Live-Camreal time face swap and one-click video deepfake with only a single image⭐ 1582⭐ 59337Python2aip…

Oracle OCP认证考试考点详解083系列08

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 36. 第36题&#xff1a; 题目 解析及答案&#xff1a; 关于数据库闪回&#xff08;FLASHBACK DATABASE&#xff09;功能&#xff0c;以下…

优化01-统计信息

Oracle 的统计信息是数据库优化器生成高效执行计划的核心依据。它记录了数据库对象&#xff08;如表、索引、列等&#xff09;的元数据信息&#xff0c;帮助优化器评估查询成本并选择最优执行路径。以下是关于 Oracle 统计信息的详细介绍&#xff1a; 一、统计信息的分类 表统…

动态规划-面试题08.01三步问题-力扣(LeetCode)

一、题目解析 此题可以类比第N个泰波那契数 二、算法解析 1、状态表示 根据上面的分析和题目要求&#xff0c;dp[i]表示&#xff1a;到达i位置&#xff0c;一共有多少种方法 2、状态转移方程 以i位置的状态&#xff0c;以最近一步划分问题 dp[i] 从i-1->i dp[i-1] 从…

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…

Java使用JDBC操作数据库

1.创建一个数据库一会用来连接 2.使用idea新建一个Java项目 3.在pom文件中加上相关依赖&#xff0c;并配置Maven路径 <dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>…

重名导致does not name a type

今天在Ubuntu24.04上编成时&#xff0c;makefile编译报错: falsecolor.h:48:9: error: ‘FalseColor’ does not name a type48 | FalseColor* content ;| ^~~~~~~~~~falsecolor.h的部分代码如下: class FalseColor {public:FalseColor(int w, int h){width …

Vue3 后台管理系统模板

Vue3 后台管理系统模板 gie仓库地址 一个基于 Vue3 TypeScript Element Plus 的后台管理系统模板&#xff0c;集成了动态路由和权限管理功能。 技术栈 Vue 3.2TypeScript 4.5Vue Router 4Vuex 4Element Plus 2.9AxiosLess 功能特性 &#x1f680; 基于 Vue3 最新技术栈开…

林业数智化转型初步设计方案

最近应林业方面的朋友要求,帮助其设计了林业方面的数字化智能化转型的方案设计,编写了如下内容,供大家参考,林业方面主要有三大方向,即林业生态、生物灾害和疫源疫病,目前已经建成了一些信息化系统,但在数字化智能化方面偏弱,就想着如何借助人工智能、物联网、大数据和…

springboot单体项目的执行流程

首先就是启动springboot项目&#xff0c;即执行主函数&#xff0c;这个主函数的类通常带有SpingBootApplication注解&#xff0c;类中的main方法就是程序的入口。 启动主函数后&#xff0c;SpringBoot会按特定顺序加载配置文件&#xff0c;如application.properties或applicat…