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:只有被删除的那个节点迭代器失效,其他都安全。

谢谢

相关推荐
特立独行的猫a2 小时前
eProsima Fast DDS & Fast DDS Spy & Shapes Demo Windows x64 从源码编译安装完全教程
windows·dds·fastdds·fastddsspy·shapesdemo
ITHAOGE152 小时前
下载| Windows 11 ARM版5月官方ISO系统映像 (适合部分笔记本、苹果M系列芯片电脑、树莓派和部分安卓手机平板)
windows·科技·微软·电脑
CS创新实验室2 小时前
当数据撞上量子:论《数据结构》课程的颠覆与新生
数据结构·量子计算
z落落2 小时前
C#ArrayList 和 List<T>核心对比和数组对比
开发语言·c#·list
代码中介商2 小时前
排序算法完全指南(八):归并排序深度详解
数据结构·算法·排序算法
感谢地心引力3 小时前
在codex里面使用Deepseek-v4,支持mac和windows双系统
windows·gpt·macos·ai·codex·deepseek
kkeeper~11 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
2401_8685347811 小时前
论企业网络设计
数据结构
不总是12 小时前
Windows 系统 Node.js 免安装版(zip)安装与配置教程(2026 最新)
前端·windows·node.js