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

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作
.💓 博客主页:倔强的石头的ZEEKLOG主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注

文章目录

一、初识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

classStudent{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);// 单元素插入voidinsert(iterator pos, size_t n,const T& val);// 批量插入voidinsert(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的底层工作机制

Read more

融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

整理 | 梦依丹      出品 | ZEEKLOG(ID:ZEEKLOGnews) 近日,开源 AI 应用开发平台 Dify 宣布完成 3000 万美元 Pre-A 轮融资,由红杉领投,GL Ventures、Alt-Alpha Capital、五源资本、瑞穗力合投资和 NYX Ventures 跟投,目前公司估值已达 1.8 亿美元。 这家从“原型工具”杀出来的黑马,如今已服务全球超 140 万台设备、2000+ 团队和 280 家企业(包括马士基、安克创新等),正朝着“全球 AI 应用工作流标准定义者”狂奔。 那么,Dify 是如何用“

By Ne0inhk

CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)

⚠️ 【全文适用重要声明】本文所有操作仅适用于 VMware/VirtualBox 本地私有虚拟机学习测试,严禁在云服务器、生产服务器、对外网开放的服务器上直接照搬执行: 1. 生产环境禁止直接关闭防火墙,应仅开放指定端口(3306 等) 2. 禁止使用弱密码、禁止关闭数据库密码安全策略 3. 禁止无限制开放 root 远程权限,应限制来源 IP 4. 所有软件请通过官方源 / 官方网站获取,支持正版版权 一、环境准备 1.1 关闭防火墙 为了避免安装过程中出现网络问题,我们先关闭防火墙并禁止其开机自启: ⚠️ 仅本地虚拟机学习环境使用,生产环境禁止直接关闭防火墙,仅需放行 3306 端口 # 停止firewall systemctl stop firewalld.service # 禁止开机自启 systemctl disable firewalld.service # 查看防火墙状态 systemctl

By Ne0inhk
Java安全开发实战:从代码防护到架构安全

Java安全开发实战:从代码防护到架构安全

第二十二章 Java安全开发实战:从代码防护到架构安全 一、章节学习目标与重点 1.1 学习目标 * 理解Java应用面临的核心安全威胁(注入攻击、跨站脚本、权限漏洞等),掌握安全开发的核心原则与防护体系。 * 熟练运用代码级安全防护技巧,解决SQL注入、XSS、CSRF、文件上传漏洞等常见安全问题。 * 掌握认证授权机制的安全设计(密码加密、JWT安全、OAuth2.0实战),避免权限越界与身份伪造。 * 实现微服务架构下的安全防护(API网关安全、服务间通信加密、配置中心安全),构建端到端安全体系。 * 能够独立完成Java应用的安全审计与漏洞排查,结合实际场景制定安全加固方案并落地。 1.2 学习重点 * Java应用常见安全漏洞(SQL注入、XSS、CSRF等)的原理与代码级防护。 * 认证授权安全:密码加密存储、JWT令牌安全、RBAC权限模型实战。 * 微服务安全:网关安全防护、服务间HTTPS通信、配置与敏感数据加密。 * 安全审计与漏洞排查工具(SonarQube、OWASP

By Ne0inhk
MySQL SQL注入防御全攻略:原理、攻击与防护实践

MySQL SQL注入防御全攻略:原理、攻击与防护实践

MySQL SQL注入防御全攻略:原理、攻击与防护实践 * 一、SQL注入基础概念 * 1.1 什么是SQL注入? * 1.2 注入攻击的危害等级 * 二、SQL注入攻击原理剖析 * 2.1 典型注入场景分析 * 2.1.1 登录绕过攻击 * 2.1.2 数据泄露攻击 * 2.2 注入类型分类 * 三、防御技术深度解析 * 3.1 参数化查询(Prepared Statements) * 3.1.1 PHP实现示例 * 3.1.2 Java实现示例 * 3.2 输入验证与过滤 * 3.2.1 白名单验证

By Ne0inhk