0

0

c++中如何使用list容器_c++ list双向链表操作指南

尼克

尼克

发布时间:2026-01-04 10:49:59

|

401人浏览过

|

来源于php中文网

原创

必须包含头文件,声明空链表为std::list lst;支持初值列表初始化和范围构造,但不支持size+value构造;仅能用迭代器增删查改,不可用下标访问。

c++中如何使用list容器_c++ list双向链表操作指南

如何正确初始化和声明 std::list

直接用 std::list 前必须包含头文件 ,它不支持随机访问,也不提供 operator[]。常见错误是当成 std::vector 用,比如写 my_list[0] —— 这会编译失败。

  • 声明空链表:std::list lst;
  • 带初值列表初始化(C++11 起):std::list<:string> names = {"Alice", "Bob", "Charlie"};
  • 用另一个容器范围构造:std::list lst(other_vec.begin(), other_vec.end());
  • 注意:不能用 std::list lst(10, 42); 这种“大小+默认值”方式初始化(那是 vector 的语法)

插入和删除操作必须用迭代器,不能用下标

std::list 是双向链表,所有增删都在常数时间完成,但前提是用对接口。误用 push_back()erase() 的迭代器版本以外的方式,容易导致逻辑错乱或性能退化。

  • 头部插入:lst.push_front(10);
  • 尾部插入:lst.push_back("hello");
  • 任意位置插入(在 it 之前):lst.insert(it, 99);
  • 删除单个元素:lst.erase(it);it 必须合法且未失效)
  • 删除满足条件的所有元素:lst.remove_if([](int x) { return x % 2 == 0; });
  • ⚠️ 错误示范:lst.erase(2); —— erase() 没有接受整数索引的重载,这行不通

遍历只能用迭代器或范围 for,不可用下标访问

因为没有 operator[]at(),任何试图“取第 n 个元素”的操作都得靠移动迭代器,时间复杂度是 O(n)。别为了图方便写循环 + std::next(it, n) 来模拟下标——那说明你可能该换容器了。

Seko
Seko

商汤科技推出的创编一体的AI短视频创作Agent

下载
  • 正向遍历推荐写法:
    for (auto it = lst.begin(); it != lst.end(); ++it) {
        std::cout << *it << "\n";
    }
  • 更简洁的范围 for:
    for (const auto& x : lst) {
        std::cout << x << "\n";
    }
  • 反向遍历:
    for (auto rit = lst.rbegin(); rit != lst.rend(); ++rit) {
        std::cout << *rit << "\n";
    }
  • 想取首/尾元素?用 lst.front() / lst.back(),但务必确保非空,否则未定义行为

list 的 splice、merge、sort 是独有优势,别忽略

这些成员函数不复制元素,只调整指针,是 list 相比其他序列容器的核心价值。尤其 splice() 可以零成本转移节点,常被用于实现任务队列、LRU 缓存等场景。

立即学习C++免费学习笔记(深入)”;

  • 把另一个 list 的全部内容接过来:lst1.splice(lst1.end(), lst2);(执行后 lst2 为空)
  • 只接某一段:lst1.splice(lst1.begin(), lst2, it1, it2);(左闭右开区间)
  • 合并两个已排序 list:lst1.merge(lst2);lst2 会被清空)
  • 原地排序:lst.sort();(支持自定义比较:lst.sort(std::greater());
  • ⚠️ 注意:sort()merge() 要求元素可比较;splice() 不调用拷贝/移动构造,所以对不可拷贝类型(如 std::unique_ptr)也安全
真正要用好 std::list,关键是放弃“按位置操作”的思维惯性。它的优势不在索引,而在稳定迭代器、高效局部增删、以及零拷贝的节点重组能力。一旦开始频繁调用 std::advance 或手写循环找第 N 个元素,就该重新评估是否选错了容器。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

381

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

314

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

524

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

191

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

998

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

55

2025.10.17

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

2

2026.01.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.9万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 11万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号