news 2026/3/8 2:19:24

C++中的list容器详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++中的list容器详解

C++中的list容器详解

1.list概述

list是C++ STL中的双向链表容器,支持在任何位置高效插入和删除元素。与vectordeque不同,list不提供随机访问能力,但提供了高效的插入和删除操作。

2. 基本特性

  • 双向链表:每个元素包含指向前后元素的指针
  • 高效插入/删除:在任何位置插入/删除都是O(1)O(1)O(1)时间复杂度
  • 无随机访问:不支持下标操作,必须通过迭代器遍历
  • 不连续存储:元素分散在内存中

3. 头文件与声明

#include<list>usingnamespacestd;list<int>lst1;// 空listlist<string>lst2(10);// 包含10个默认构造的stringlist<double>lst3(5,3.14);// 包含5个3.14list<char>lst4={'a','b','c'};// 初始化列表

4. 构造函数与初始化

4.1 默认构造

list<int>lst;

4.2 填充构造

list<int>lst(10);// 10个默认初始化的int(0)list<int>lst(5,100);// 5个100

4.3 范围构造

intarr[]={1,2,3};list<int>lst(arr,arr+3);

4.4 拷贝构造

list<int>lst2(lst1);

5. 容量操作

5.1size()

cout<<lst.size();// 返回元素数量

5.2empty()

if(lst.empty()){cout<<"List is empty";}

5.3max_size()

cout<<lst.max_size();// 返回list可容纳的最大元素数

5.4resize()

lst.resize(10);// 调整为10个元素,新增元素默认初始化lst.resize(15,5);// 调整为15个元素,新增元素初始化为5

6. 元素访问

6.1front()

lst.front()=5;// 修改第一个元素intfirst=lst.front();// 访问第一个元素

6.2back()

lst.back()=8;// 修改最后一个元素intlast=lst.back();// 访问最后一个元素

7. 修改操作

7.1push_back()

lst.push_back(10);// 在尾部插入10

7.2push_front()

lst.push_front(5);// 在头部插入5

7.3pop_back()

lst.pop_back();// 删除尾部元素

7.4pop_front()

lst.pop_front();// 删除头部元素

7.5insert()

autoit=lst.insert(lst.begin(),15);// 在头部插入15lst.insert(it,{1,2,3});// 在指定位置插入多个元素

7.6erase()

lst.erase(lst.begin());// 删除第一个元素lst.erase(lst.begin(),lst.end());// 删除所有元素

7.7clear()

lst.clear();// 清空所有元素

7.8swap()

list<int>lst2;lst.swap(lst2);// 交换两个list的内容

8. 特殊操作

8.1splice()

list<int>lst2={4,5,6};lst.splice(lst.end(),lst2);// 将lst2所有元素移动到lst尾部lst.splice(lst.begin(),lst2,lst2.begin());// 移动lst2的第一个元素

8.2remove()

lst.remove(5);// 删除所有值为5的元素

8.3remove_if()

lst.remove_if([](intn){returnn%2==0;});// 删除所有偶数

8.4unique()

lst.unique();// 删除连续重复元素

8.5merge()

list<int>lst2={4,5,6};lst.sort();lst2.sort();lst.merge(lst2);// 合并两个已排序list

8.6sort()

lst.sort();// 升序排序lst.sort(greater<int>());// 降序排序

8.7reverse()

lst.reverse();// 反转list

9. 迭代器

9.1begin()&end()

for(autoit=lst.begin();it!=lst.end();++it){cout<<*it<<" ";}

9.2rbegin()&rend()

for(autorit=lst.rbegin();rit!=lst.rend();++rit){cout<<*rit<<" ";// 反向遍历}

10. 完整示例

#include<iostream>#include<list>#include<algorithm>usingnamespacestd;intmain(){// 创建并初始化listlist<int>lst={2,3,4};// 头部和尾部操作lst.push_front(1);// 头部插入1lst.push_back(5);// 尾部插入5// 访问元素cout<<"First element: "<<lst.front()<<endl;cout<<"Last element: "<<lst.back()<<endl;// 插入元素autoit=next(lst.begin(),2);// 获取第3个位置的迭代器lst.insert(it,{7,8,9});// 在第3个位置插入7,8,9// 删除元素lst.pop_front();// 删除头部元素lst.remove(8);// 删除所有8// 特殊操作list<int>lst2={10,11,12};lst.splice(lst.end(),lst2);// 合并lst2到lstlst.sort();// 排序lst.unique();// 去重// 遍历listcout<<"All elements: ";for(intnum:lst){cout<<num<<" ";}cout<<endl;// 容量信息cout<<"Size: "<<lst.size()<<endl;cout<<"Is empty: "<<(lst.empty()?"Yes":"No")<<endl;return0;}

11. 性能提示

  1. 在任何位置插入/删除元素性能都很好(O(1)O(1)O(1))
  2. 查找元素需要遍历(O(n)O(n)O(n))
  3. 迭代器在插入/删除操作后仍然有效(除非删除的是迭代器指向的元素)
  4. 适合频繁插入/删除但不需随机访问的场景
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/2 23:35:17

政务热线语音转写:国产化适配中的TensorRT兼容性测试

政务热线语音转写&#xff1a;国产化适配中的TensorRT兼容性测试 在政务服务智能化升级的浪潮中&#xff0c;公众对热线响应速度与服务质量的要求日益提高。传统的电话坐席模式受限于人力成本高、服务时段固定、响应延迟等问题&#xff0c;已难以满足724小时高效互动的需求。越…

作者头像 李华
网站建设 2026/3/7 9:19:06

STM32CubeMX安装教程:驱动安装与常见问题解析

STM32CubeMX 安装实战指南&#xff1a;从零配置到稳定运行 你是不是也遇到过这种情况——刚下载好 STM32CubeMX&#xff0c;双击启动却毫无反应&#xff1f;或者连接开发板时设备管理器里只显示“未知设备”&#xff1f;又或是打开软件后搜索不到自己的芯片型号&#xff1f; …

作者头像 李华
网站建设 2026/3/7 8:47:50

为什么金融行业开始采用TensorRT部署风控大模型?

为什么金融行业开始采用TensorRT部署风控大模型&#xff1f; 在高频交易、实时反欺诈和跨境支付等现代金融场景中&#xff0c;一笔交易从发生到完成往往只有几十毫秒的时间窗口。在这短暂的瞬间&#xff0c;系统不仅要完成身份验证、额度检查&#xff0c;还要判断这笔操作是否涉…

作者头像 李华
网站建设 2026/3/7 8:58:50

广告推荐系统延迟优化:TensorRT在CTR模型中的实践

广告推荐系统延迟优化&#xff1a;TensorRT在CTR模型中的实践 在高并发的广告推荐场景中&#xff0c;一次用户请求背后往往需要完成数百甚至上千次的点击率&#xff08;CTR&#xff09;预测。每一轮打分都必须在毫秒级内完成——这不仅是技术挑战&#xff0c;更是直接影响收入…

作者头像 李华
网站建设 2026/3/7 5:54:58

AD导出Gerber文件:手把手教程(从零实现)

从零搞定AD导出Gerber文件&#xff1a;工程师实战全指南 你有没有遇到过这样的情况——辛辛苦苦画完PCB&#xff0c;DRC也通过了&#xff0c;结果发给工厂打样时却被退回&#xff1a;“缺G2层”“钻孔文件没生成”“阻焊开窗太大”…… 明明觉得自己“已经导出了”&#xff0c…

作者头像 李华