list(下)

1.常用接口

1.1初始化与构造

std::list<int> l1;

创建一个空的双向链表,模板参数指定元素类型为int

std::list<int> l2(5, 10);

创建包含5个元素的链表,每个元素初始化为10。

std::list<int> l3 = {1, 2, 3};

通过初始化列表构造链表,包含元素1、2、3。


1.2元素访问

l.front()

返回链表第一个元素的引用。若链表为空,行为未定义。

l.back()

返回链表最后一个元素的引用。若链表为空,行为未定义。

注意:std::list不提供随机访问接口(如operator[]),因链表结构不支持O(1)时间复杂度的随机访问。


1.3迭代器操作

l.begin() / l.end()

返回指向首元素和尾后位置的迭代器。

l.rbegin() / l.rend()

返回反向迭代器,用于逆序遍历。

示例遍历:

cpp 复制代码
for (auto it = l.begin(); it != l.end(); ++it) {
    std::cout << *it << " ";
}

1.4插入与删除

l.push_back(10)

在链表末尾插入元素10。

l.push_front(20)

在链表头部插入元素20。

l.insert(it, 30)

在迭代器it指向的位置前插入30,返回新元素的迭代器。

l.pop_back()

删除末尾元素,链表为空时行为未定义。

l.pop_front()

删除头部元素,链表为空时行为未定义。

l.erase(it)

删除迭代器it指向的元素,返回下一个有效迭代器。


1.5容量操作

l.empty()

判断链表是否为空,时间复杂度O(1)。

l.size()

返回元素数量,C++11起保证为O(1),早期实现可能为O(n)。

l.resize(10)

调整链表大小为10,不足时用默认值填充,多余元素被删除。


1.6特殊操作

l.splice(it, other_list)

other_list的所有元素移动到当前链表的it位置前,other_list变为空。

l.sort()

对链表进行排序,默认升序。可传入比较函数:

cpp 复制代码
l.sort(std::greater<int>()); // 降序排序

l.merge(other_list)

合并两个已排序链表,结果保存在当前链表,other_list变为空。

l.unique()

删除连续重复元素。可传入二元谓词判断重复条件。


1.7示例代码
cpp 复制代码
#include <iostream>
#include <list>

int main() {
    std::list<int> l = {5, 3, 1};
    l.push_back(7);      // 5, 3, 1, 7
    l.push_front(2);     // 2, 5, 3, 1, 7
    l.sort();            // 1, 2, 3, 5, 7
    
    auto it = l.begin();
    std::advance(it, 2);
    l.insert(it, 4);     // 1, 2, 4, 3, 5, 7
    
    l.remove_if([](int x) { return x % 2 == 0; }); // 删除偶数
    
    for (int x : l) {
        std::cout << x << " ";  // 输出: 1 3 5 7
    }
}

2.对比list和vector

2.1详细对比表
特性 vector (动态数组) list (双向链表)
内存结构 连续内存 分散节点,每个节点存数据 + 前后指针
随机访问 支持 O (1) ,直接用 [] / at() 不支持,只能从头 / 尾遍历
头部插入 慢 O (n),需要移动所有元素 快 O (1)
尾部插入 快 O (1)(偶尔扩容) 快 O (1)
中间插入 / 删除 慢 O (n),需要移动数据 快 O (1)(已知迭代器时)
迭代器失效 插入 / 删除容易失效 只有删除节点失效,其他不受影响
内存占用 小(紧凑) 大(每个节点多存两个指针)
缓存效率 高(连续内存,CPU 缓存友好) 低(跳跃访问,缓存不命中)
适用场景 读多、尾部增删、需要随机访问 频繁中间插入 / 删除、不需要随机访问
2.2关键功能差异详解

vector ✅ 支持随机访问

cpp 复制代码
vector<int> v = {1,2,3};
cout << v[1];   // 直接访问,超快

list ❌ 不支持随机访问

cpp 复制代码
list<int> l = {1,2,3};
// cout << l[1];  报错!没有[]运算符

想访问中间元素必须遍历,效率极低。

2.3插入 / 删除速度

vector:尾部 push_back:极快 中间 / 头部插入:很慢(要移动后面所有元素)
list:任意位置插入 / 删除:都很快(只改指针,不移动数据)

2.4. 迭代器失效

vector:扩容 / 插入 / 删除 → 很多迭代器直接失效
list:只有被删除的那个节点迭代器失效,其他都安全。

谢谢

相关推荐
土司大王2 小时前
LeetCode hot100——除了自身以外数组的乘积
数据结构·算法·leetcode
WA内核拾荒者2 小时前
WhatsApp账号运营SOP的可视化编排与流水线监控
大数据·数据库·windows
Java小白笔记4 小时前
Windows系统免软件命令激活
java·网络·人工智能·windows·ai·ai编程
神威难绷泪6 小时前
数据结构:哈希表 算法相关 排序算法
数据结构
IT小盘6 小时前
17-AI应用防止越权访问知识库
服务器·网络·windows
rust&python6 小时前
通达信量化tdxquant快速开始第一个策略
windows·量化·通达信·tdxquant
Albart5756 小时前
Windows快速访问幽灵文件夹彻底解决|清除tmp残留_无效固定项_侧边栏残留(Win10_Win11通用)
windows·powershell脚本·快速访问修复·幽灵文件夹清理·tmp垃圾清除·电脑系统优化
Zguigo8 小时前
树的前序|中序|后序遍历【使用栈实现】
数据结构·算法
2401_869769598 小时前
list 2
数据结构·list
zhonyu鱼9 小时前
Pot 翻译:开源免费的跨平台划词翻译与 OCR 工具
windows·macos·开源·ocr·开源软件