C++ STL list

server/2025/3/18 23:14:54/

文章目录

    • 1. `std::list` 的特性
    • 2. 包含头文件
    • 3. 声明和初始化 `std::list`
    • 4. 常用成员函数
      • 4.1 元素访问
      • 4.2 容量
      • 4.3 修改容器
      • 4.4 迭代器
      • 4.5 其他常用函数
    • 5. 使用示例
    • 6. 注意事项
    • 7. 与其他容器的比较
    • 总结

在 C++ 标准模板库(STL)中,std::list 是一个双向链表容器,提供了高效的插入和删除操作,特别适合需要频繁修改元素顺序的场景。下面将详细介绍 std::list 的特性、常用成员函数以及使用示例。

list__4">1. std::list 的特性

  • 双向链表:每个元素都有指向前一个和后一个元素的指针,支持双向遍历。
  • 动态大小:可以根据需要动态增加或减少元素数量,无需预先分配内存。
  • 任意位置插入和删除效率高:在已知位置的情况下,插入和删除操作的时间复杂度为 O(1)。
  • 不支持随机访问:无法像 std::vector 那样通过索引直接访问元素,必须通过迭代器顺序访问。

2. 包含头文件

使用 std::list 需要包含 <list> 头文件:

#include <list>

list_19">3. 声明和初始化 std::list

#include <list>
#include <iostream>int main() {// 声明一个空的整数列表std::list<int> myList;// 使用初始化列表声明并初始化列表std::list<int> anotherList = {1, 2, 3, 4, 5};// 声明一个具有固定大小的列表,并初始化所有元素为10std::list<int> sizedList(10, 10);// 使用另一个列表的元素初始化std::list<int> copiedList(anotherList);return 0;
}

4. 常用成员函数

4.1 元素访问

  • front():访问第一个元素。
  • back():访问最后一个元素。
std::list<int> lst = {1, 2, 3};
std::cout << "第一个元素: " << lst.front() << std::endl; // 输出 1
std::cout << "最后一个元素: " << lst.back() << std::endl; // 输出 3

4.2 容量

  • empty():检查列表是否为空。
  • size():返回列表中的元素数量。
if (lst.empty()) {std::cout << "列表为空。" << std::endl;
} else {std::cout << "列表大小: " << lst.size() << std::endl; // 输出 3
}

4.3 修改容器

  • push_back(value):在列表末尾添加元素。
  • push_front(value):在列表开头添加元素。
  • pop_back():移除列表末尾的元素。
  • pop_front():移除列表开头的元素。
  • insert(iterator position, value):在指定位置插入元素。
  • erase(iterator position):移除指定位置的元素。
  • clear():移除所有元素。
lst.push_back(4);
lst.push_front(0);
// lst 现在为 {0, 1, 2, 3, 4}lst.pop_back(); // 移除4
lst.pop_front(); // 移除0
// lst 现在为 {1, 2, 3}auto it = lst.begin();
++it; // 指向2
lst.insert(it, 10); // 在2之前插入10
// lst 现在为 {1, 10, 2, 3}it = lst.begin();
++it; ++it; // 指向2
lst.erase(it); // 移除2
// lst 现在为 {1, 10, 3}lst.clear(); // lst 现在为空

4.4 迭代器

std::list 支持双向迭代器,可以用于遍历列表中的元素。

for (auto it = lst.begin(); it != lst.end(); ++it) {std::cout << *it << " ";
}// 使用范围-based for 循环(需要 C++11 及以上)
for (const auto& element : lst) {std::cout << element << " ";
}

4.5 其他常用函数

  • splice():将一个列表的元素转移到另一个列表。
  • remove(value):移除所有等于指定值的元素。
  • remove_if(predicate):移除满足条件的元素。
  • sort():对列表进行排序。
  • reverse():反转列表中的元素顺序。
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};// 将 list2 的所有元素转移到 list1 的末尾
list1.splice(list1.end(), list2);
// list1 现在为 {1, 2, 3, 4, 5, 6}// 移除所有值为3的元素
list1.remove(3);
// list1 现在为 {1, 2, 4, 5, 6}// 排序列表
list1.sort();
// list1 保持 {1, 2, 4, 5, 6}(已经有序)// 反转列表
list1.reverse();
// list1 现在为 {6, 5, 4, 2, 1}

5. 使用示例

下面是一个综合示例,展示如何使用 std::list 进行基本操作:

#include <iostream>
#include <list>int main() {// 创建并初始化列表std::list<int> numbers = {5, 3, 1, 4, 2};// 输出初始列表std::cout << "初始列表: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 在开头插入元素numbers.push_front(0);std::cout << "插入0后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 在末尾插入元素numbers.push_back(6);std::cout << "插入6后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 删除第一个元素numbers.pop_front();std::cout << "删除第一个元素后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 删除最后一个元素numbers.pop_back();std::cout << "删除最后一个元素后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 在指定位置插入元素auto it = numbers.begin();std::advance(it, 2); // 指向第三个元素(1)numbers.insert(it, 99);std::cout << "在第三个位置插入99后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 移除特定值的元素numbers.remove(4);std::cout << "移除所有4后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 排序列表numbers.sort();std::cout << "排序后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;// 反转列表numbers.reverse();std::cout << "反转后: ";for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:
在这里插入图片描述

6. 注意事项

  • 不支持随机访问:与 std::vectorstd::deque 不同,std::list 不支持通过索引直接访问元素,必须通过迭代器进行遍历。
  • 内存开销:由于每个元素都有前后指针,std::list 的内存开销比 std::vector 大。
  • 迭代器失效:在插入或删除元素时,只有被删除元素对应的迭代器会失效,其他迭代器仍然有效(除非操作导致列表重新分配,但 std::list 不会重新分配内存)。

7. 与其他容器的比较

特性std::vectorstd::dequestd::list
随机访问支持支持不支持
插入/删除效率尾部高效,中间低效头尾高效,中间低效所有位置都高效
内存开销较低中等较高
迭代器稳定性插入/删除可能导致失效插入/删除可能导致失效只有被删除元素的迭代器失效

根据具体需求选择合适的容器。例如,如果需要频繁在中间插入或删除元素,且不需要随机访问,std::list 是一个不错的选择;如果需要快速的随机访问,且主要在尾部进行插入和删除,std::vector 更为合适。

总结

std::list 是 C++ STL 中一个功能强大的双向链表容器,适用于需要频繁修改元素顺序的场景。了解其特性和常用成员函数,可以帮助我们更高效地编写代码。在实际应用中,应该根据具体需求选择最合适的容器类型。


http://www.ppmy.cn/server/176076.html

相关文章

qt介绍图表 charts 一

qt chartsj基于Q的Graphics View框架&#xff0c;其核心组件是QChartView和QChart.QChartView是一个显示图表的独立部件&#xff0c;基类为QGraphicsView.QChar类管理图表的序列&#xff0c;图例和轴示意图。 绘制一个cos和sin曲线图&#xff0c;效果如下 实现代码 #include…

单臂路由+VLANIF

涉及的具体实验步骤在&#xff1a;三层交换机实现路由功能_三层交换机打开路由功能-CSDN博客 1.技术背景&#xff1a;VLAN间通信 传统交换二层组网中&#xff0c;默认所有网络都处于同一个广播域&#xff0c;这带了诸多问题。VLAN&#xff08;Virtual Local Area Network&…

浅谈StarRocks数据库简介及应用

StarRocks是一款高性能的实时分析型数据库&#xff0c;专为复杂的SQL查询提供极高的性能&#xff0c;尤其适用于数据分析场景。它是一款开源的新一代极速全场景MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;数据库&#xff0c;致力于构…

3ds Max 导入到 After Effects 还原摄像机要注意事项--deepseek

我&#xff1a;dp我这有两个脚本分别是syn软件相机导出到max的和syn软件相机导出到ae的&#xff0c;你能看出差别来吗&#xff1f;如果我想把max里的相机导入到ae里&#xff0c;保持原来的位置方向&#xff0c;该怎么做 dp&#xff1a;从这两个脚本可以看出&#xff0c;3ds Ma…

set详讲(C++)

目录 1. 前言 2. 预备知识 2.1 关联式容器 2.2 键值对 3. set详解 3.1 set是什么 3.2 set模板参数列表 3.3 set构造 3.4 set的使用 3.4.1 insert 3.4.2 find 3.4.3 erase 3.4.4 swap 3.4.5 empty 3.4.6 size 3.4.7 count 3.4.8 lower_bound 3.8.9 upper_bound…

区块链加密技术公司DApp开发指南:从零开始到上线

随着区块链技术的普及&#xff0c;去中心化应用&#xff08;DApp&#xff09;成为加密技术公司探索的核心领域。本文结合行业实践与最新技术趋势&#xff0c;系统梳理DApp从需求分析到上线的完整开发流程&#xff0c;并融入关键工具、安全策略与案例解析&#xff0c;助力企业高…

C语言及内核开发中的回调机制与设计模式分析

在C语言以及操作系统内核开发中,回调机制是一种至关重要的编程模式。它通过注册框架和定义回调函数,实现了模块间的解耦和灵活交互,为系统的扩展性和可维护性提供了有力支持。本文将深入探讨这种机制的工作原理、应用场景以及与设计模式的关联。 一、回调机制的核心概念 (…

网络工程安全从入门到“入魂“教学案

网络工程安全从入门到"入魂"教学案 ——“让黑客哭着改行的必修课” ​ 感觉这些年&#xff0c;网工都属于冷门工作&#xff0c;之前想学在网上也找不到啥资料&#xff0c;现在略有小成&#xff0c;给各位想学网工的小白提供一些入门的资料 专栏的实验在eve平台展…