首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

原创
作者头像
倔强的石头_
发布2025-05-31 09:50:39
发布2025-05-31 09:50:39
1830
举报
文章被收录于专栏:C/C++指南C/C++指南

@toc

一、初识list容器

1.1 什么是list?

在C++标准模板库(STL)中,list是一个基于双向链表实现的序列容器。它允许在任意位置进行高效插入和删除操作,时间复杂度为O(1)。与vector不同,list不保证元素在内存中的连续存储,因此不支持随机访问。

在这里插入图片描述
在这里插入图片描述

1.2 核心特性

  • 双向链表结构:每个元素包含指向前后节点的指针
  • 动态内存分配:元素按需分配内存
  • 高效插入删除:无需移动其他元素
  • 迭代器稳定性:插入删除操作不会使已有迭代器失效(除被删除元素)

1.3 典型应用场景

  • 需要频繁在首尾之外的位置插入/删除元素
  • 元素体积较大,避免vector扩容时的拷贝开销
  • 需要维护元素的插入顺序
  • 需要合并、拆分链表等特殊操作

二、核心成员函数

2.1 默认成员函数

在这里插入图片描述
在这里插入图片描述

构造函数的重载版本

在这里插入图片描述
在这里插入图片描述

函数

功能描述

示例

默认构造函数

创建空list

list<int> lst1;

填充构造函数

创建包含n个元素的list

list<char> lst2(5);

拷贝构造函数

复制另一个list的内容

list<int> lst3(lst2);

移动构造函数(C++11)

转移另一个list的资源

list<int> lst4(move(lst3));

析构函数

自动释放内存(通常无需手动调用)

lst1.~list();

拷贝赋值运算符

深拷贝赋值操作

lst2 = lst1;

移动赋值运算符(C++11)

高效转移资源赋值操作

lst3 = move(lst2);

代码语言:cpp
复制
// 初始化列表构造(C++11)
list<string> fruits {"apple", "banana", "cherry"};

三、迭代器操作

在这里插入图片描述
在这里插入图片描述

3.1 基础迭代器

函数

功能

示例

begin()

返回指向第一个元素的迭代器

auto it = lst.begin();

end()

返回末尾哨兵迭代器

while(it != lst.end())

rbegin()

返回反向起始迭代器

auto rit = lst.rbegin();

rend()

返回反向结束迭代器

for(; rit != lst.rend();)

3.2 常量迭代器(C++11)

函数

功能

示例

cbegin()

返回不可修改的正向起始迭代器

auto cit = lst.cbegin();

cend()

返回不可修改的正向结束迭代器

if(cit == lst.cend())

crbegin()

返回不可修改的反向起始迭代器

auto crit = lst.crbegin();

crend()

返回不可修改的反向结束迭代器

while(crit != lst.crend())

代码语言:cpp
复制
list<int> nums {1,2,3};
// 正向遍历
for(auto it = nums.begin(); it != nums.end(); ++it) {
    cout << *it << " ";  // 输出:1 2 3
}

四、容量与访问操作

在这里插入图片描述
在这里插入图片描述

4.1 容量查询

函数

功能

示例

size()

返回元素数量

if(lst.size() > 5)

empty()

判断容器是否为空

while(!lst.empty())

4.2 元素访问

函数

功能

示例

front()

访问首元素(可修改)

lst.front() = 10;

back()

访问尾元素(可修改)

cout << lst.back();

代码语言:cpp
复制
list<double> temps {36.5, 37.1, 38.0};
temps.front() = 35.9;  // 修改首元素
cout << "当前体温:" << temps.back();  // 输出38.0

五、修改操作详解

在这里插入图片描述
在这里插入图片描述

5.1 基础修改函数

函数

功能

示例

push_front(val)

头部插入元素

lst.push_front(0);

emplace_front(args)

头部直接构造元素

lst.emplace_front("test");

pop_front()

删除头部元素

lst.pop_front();

push_back(val)

尾部插入元素

lst.push_back(100);

emplace_back(args)

尾部直接构造元素

lst.emplace_back(1,2);

pop_back()

删除尾部元素

lst.pop_back();

clear()

清空所有元素

lst.clear();

push_back vs emplace_back

代码语言:cpp
复制
class Student {
public:
    Student(int id, string name) : id(id), name(name) {}
private:
    int id;
    string name;
};

list<Student> roster;
roster.push_back(Student(101, "Alice"));  // 构造临时对象+拷贝
roster.emplace_back(102, "Bob");         // 直接构造(高效)

5.2 高级修改操作

函数

功能

示例

assign(n, val)

用n个val替换内容

lst.assign(5, 0);

assign(beg, end)

用迭代器范围替换内容

lst.assign(vec.begin(), vec.end());

swap(other)

交换两个list的内容

lst1.swap(lst2);

resize(n)

调整元素数量

lst.resize(10);

resize(n, val)

调整数量并用val填充新增元素

lst.resize(15, -1);

代码语言:cpp
复制
list<int> nums;
nums.assign({1,2,3});       // 内容变为[1,2,3]
nums.resize(5);             // 变为[1,2,3,0,0]
nums.resize(3);             // 截断为[1,2,3]

5.3 插入与删除

insert重载版本
代码语言:cpp
复制
iterator insert(iterator pos, const T& val);  // 单元素插入
void insert(iterator pos, size_t n, const T& val); // 批量插入
void insert(iterator pos, InputIt first, InputIt last); // 范围插入
erase操作
代码语言:cpp
复制
iterator erase(iterator pos);                 // 删除单个元素
iterator erase(iterator first, iterator last); // 删除区间元素

示例

代码语言:cpp
复制
list<int> data {10,20,30};
auto it = data.begin();
advance(it, 1);

data.insert(it, 15);        // [10,15,20,30]
data.insert(it, 2, 18);     // [10,15,18,18,20,30]
vector<int> tmp {25,35};
data.insert(data.end(), tmp.begin(), tmp.end()); // 末尾追加

data.erase(it);             // 删除第二个18

六、特殊成员函数

在这里插入图片描述
在这里插入图片描述

6.1 条件操作

函数

功能

示例

remove(val)

删除所有等于val的元素

lst.remove(5);

remove_if(pred)

删除满足条件的元素

lst.remove_if([](int n){ return n%2==0; });

代码语言:cpp
复制
list<int> nums {1,2,3,2,5};
nums.remove(2);  // 删除所有2 → [1,3,5]
nums.remove_if([](int x){ return x>3; }); // → [1,3]

6.2 链表特有操作

函数

功能

示例

unique()

删除连续重复元素

lst.unique();

merge(other)

合并有序链表

lst1.merge(lst2);

sort()

排序元素(升序)

lst.sort();

splice(pos, other)

转移另一个链表的元素

lst1.splice(it, lst2);

代码语言:cpp
复制
list<int> a {1,3,5}, b {2,4,6};
a.merge(b);       // a变为[1,2,3,4,5,6], b为空
a.sort();         // 排序(若未有序)

list<int> x {10,20}, y {30,40};
auto pos = x.begin();
x.splice(pos, y); // x变为[30,40,10,20], y为空

七、总结与进阶

本文详细介绍了C++ list容器的基本特性和使用方法。通过大量的代码示例,我们学习了如何正确使用list进行元素的增删改查操作。list作为STL中重要的序列式容器,其独特的链表结构使其在特定场景下具有不可替代的优势。

在接下来的系列文章中,我们将深入探讨:

  • list的高级应用技巧
  • list在实际项目中的最佳实践案例

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、初识list容器
    • 1.1 什么是list?
    • 1.2 核心特性
    • 1.3 典型应用场景
  • 二、核心成员函数
    • 2.1 默认成员函数
  • 三、迭代器操作
    • 3.1 基础迭代器
    • 3.2 常量迭代器(C++11)
  • 四、容量与访问操作
    • 4.1 容量查询
    • 4.2 元素访问
  • 五、修改操作详解
    • 5.1 基础修改函数
    • 5.2 高级修改操作
    • 5.3 插入与删除
      • insert重载版本
      • erase操作
  • 六、特殊成员函数
    • 6.1 条件操作
    • 6.2 链表特有操作
  • 七、总结与进阶
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档