C++--STL库-List

目录

[1.list 的基本使用](#1.list 的基本使用)

[1.1 创建和初始化](#1.1 创建和初始化)

[1.2. 插入元素](#1.2. 插入元素)

[1.3. 删除元素](#1.3. 删除元素)

[1.4. 访问元素](#1.4. 访问元素)

[1.5 遍历](#1.5 遍历)

[1.6 总结](#1.6 总结)


list是C++标准库(STL)中的双向链表 容器,属于<list>头文件。

它的特点是:
动态大小:可以随时插入或删除元素,不需要手动管理内存。
双向链表:每个节点都连接前后两个节点,支持双向遍历。
高效插入删除:插入和删除的时间复杂度是 O(1) ,比vector快(vector可能会移动大量元素)。
随机访问慢:不像vector可以直接访问vec[i]list只能顺序遍历(O(n))。

1.list 的基本使用

1.1创建和初始化

cpp 复制代码
std::list<int> lst1;                  // 创建空 list
std::list<int> lst2 = {1, 2, 3, 4, 5}; // 用初始化列表创建
std::list<int> lst3(5, 100);           // 创建 5 个元素,每个值都为 100
std::list<int> lst4(lst2);             // 拷贝构造

1.2. 插入元素

cpp 复制代码
lst.push_back(10);  // 尾部插入 10
lst.push_front(5);  // 头部插入 5

auto it = lst.begin();
std::advance(it, 2); // 迭代器前进 2 步
lst.insert(it, 99);  // 在第 3 个位置插入 99

1.3. 删除元素

cpp 复制代码
lst.pop_back();   // 删除最后一个元素
lst.pop_front();  // 删除第一个元素

auto it = lst.begin();
std::advance(it, 1);
lst.erase(it);    // 删除第二个元素

lst.remove(3);    // 删除所有值为 3 的元素
lst.clear();      // 清空 list

1.4. 访问元素

cpp 复制代码
std::cout << lst.front(); // 访问第一个元素
std::cout << lst.back();  // 访问最后一个元素

1.5 遍历

cpp 复制代码
// 方式 1:使用范围 for
for (int num : lst) {
    std::cout << num << " ";
}

// 方式 2:使用迭代器
for (std::list<int>::iterator it = lst.begin(); it != lst.end(); ++it) {
    std::cout << *it << " ";
}

1.6 总结

|------|------------------------------|--------------------|
| 区别 | vector(动态数组) | list(双向链表) |
| 底层结构 | 动态数组(连续内存) | 双向链表(分散存储) |
| 访问速度 | 随机访问快 (O(1)) | 随机访问慢 (O(n)) |
| 插入删除 | 尾部操作快 (O(1)),中间插入/删除慢 (O(n)) | 任意位置插入/删除快 (O(1)) |
| 内存使用 | 连续存储,节省空间,但可能需要扩容 | 每个节点有额外指针开销,内存占用较大 |
| 遍历方式 | 支持 \[\],可用 +、- 运算符 | 只能用迭代器 ++ 或 -- |

相关推荐
xiaoshuaishuai834 分钟前
C# AvaloniaUI动态显示图片
开发语言·c#
QiLinkOS44 分钟前
【从实验室到商业战场:发明专利如何重塑科技与企业的共生生态】
大数据·c语言·数据结构·c++·人工智能·单片机·算法
日光明媚1 小时前
一步生成视频!One-Forcing:DMD + 零成本 GAN,训练 200 步超越多步 SOTA
android·开发语言·kotlin
2301_803538951 小时前
Java读取Word图片的两种实用方法
java·开发语言·word
Irissgwe1 小时前
c++11(lambda表达式与包装器、线程库)
c++·c++11·lambda表达式·线程库·包装器·互斥量库·条件变量库
Peter·Pan爱编程2 小时前
14. Lambda 表达式:随手可写的函数对象
c++·算法·ai编程
不想写代码的星星3 小时前
从分支预测角度看 C++:为什么你的热循环慢得离谱?
c++
bug和崩溃我都要3 小时前
Qt 封装 libmpv 全功能视频播放器开发指南
开发语言·qt·音视频
郝学胜-神的一滴3 小时前
Qt 高级开发 018:复刻经典登录界面布局与窗口美化全解析
开发语言·c++·qt·程序人生·用户界面
郝亚军3 小时前
IEEE 754 单精度浮点的SEM表示
开发语言·c++·算法