C++:双向列表list

C++ 标准库中的 std::list 是一个双向链表实现。std::list 是一个模板类,定义在 <list> 头文件中。它提供了一个双向链表的数据结构,用于在链表的两端进行快速插入和删除操作。

std::list 的主要特点

  1. 双向链表

    • 双向:每个节点都有指向前一个节点和下一个节点的指针,这使得在链表的任何位置都可以高效地插入或删除元素。
    • 链表节点:链表中的每个节点存储一个数据元素以及两个指针(前向和后向指针)。
  2. 插入和删除操作

    • 高效插入/删除:在链表的任何位置(包括头部、尾部和中间)插入或删除元素的时间复杂度为常数时间(O(1)),前提是你已经得到了要插入或删除位置的迭代器。
    • 不支持随机访问 :与 std::vectorstd::deque 不同,std::list 不支持直接通过索引访问元素。只能通过迭代器进行顺序访问。
  3. 迭代器

    • 双向迭代器std::list 提供双向迭代器,允许你在链表中前向或后向遍历。
  4. 不支持快速随机访问

    • 无法随机访问 :不像 std::vectorstd::dequestd::list 不允许使用下标操作符访问元素。
  5. 元素的稳定性

    • 稳定性:插入和删除操作不会改变链表中其他元素的地址。每个元素在链表中具有稳定的地址。

示例代码

以下是 std::list 的一些基本用法示例:

cpp 复制代码
#include <iostream>
#include <list>

int main() {
    // 创建一个 std::list 对象,元素为 int 类型
    std::list<int> myList;

    // 向列表中插入元素
    myList.push_back(10);  // 在尾部插入
    myList.push_front(5);  // 在头部插入

    // 遍历列表并打印所有元素
    std::cout << "List elements: ";
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    // 插入元素到指定位置
    auto it = myList.begin();
    ++it;  // 指向第二个元素
    myList.insert(it, 7);  // 在第二个位置插入 7

    // 删除元素
    myList.remove(10);  // 删除所有值为 10 的元素

    // 打印所有元素
    std::cout << "List after deletion: ";
    for (const auto& element : myList) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

代码解释

  1. 创建列表

    • std::list<int> myList; 创建一个 int 类型的 std::list 对象。
  2. 插入元素

    • myList.push_back(10); 将 10 插入到列表的尾部。
    • myList.push_front(5); 将 5 插入到列表的头部。
  3. 遍历和打印

    • 使用范围-based for 循环遍历 std::list 中的所有元素,并打印它们。
  4. 插入到指定位置

    • auto it = myList.begin(); 获取指向列表第一个元素的迭代器。
    • myList.insert(it, 7); 在第二个位置插入元素 7。
  5. 删除元素

    • myList.remove(10); 删除列表中所有值为 10 的元素。
  6. 打印所有元素

    • 再次遍历并打印列表中剩余的所有元素。

总结

  • std::list 是一个双向链表实现,提供高效的插入和删除操作,适用于需要频繁在链表中间进行插入或删除的场景。
  • 不支持:随机访问,不能通过下标操作符访问元素。
  • 支持:双向迭代器,允许在链表中进行前向和后向遍历。
相关推荐
小龙报13 分钟前
《算法通关指南:数据结构和算法篇 --- 顺序表相关算法题》--- 询问学号,寄包柜,合并两个有序数组
c语言·开发语言·数据结构·c++·算法·学习方法·visual studio
序属秋秋秋13 分钟前
《Linux系统编程之开发工具》【编译器 + 自动化构建器】
linux·运维·服务器·c语言·c++·自动化·编译器
数据知道17 分钟前
Go语言设计模式:工厂模式详解
开发语言·设计模式·golang·go语言·工厂模式
AI视觉网奇42 分钟前
coco json 分类标注工具源代码
开发语言·python
夏玉林的学习之路1 小时前
正则表达式
数据库·c++·qt·mysql·正则表达式
夜晚中的人海1 小时前
【C++】模拟算法习题
c++·算法·哈希算法
勇敢牛牛_1 小时前
Rust真的适合写业务后端吗?
开发语言·后端·rust
要加油GW1 小时前
python使用vscode 需要配置全局的环境变量。
开发语言·vscode·python
B站计算机毕业设计之家1 小时前
python图像识别系统 AI多功能图像识别检测系统(11种识别功能)银行卡、植物、动物、通用票据、营业执照、身份证、车牌号、驾驶证、行驶证、车型、Logo✅
大数据·开发语言·人工智能·python·图像识别·1024程序员节·识别
报错小能手2 小时前
C++笔记(面向对象)多态(编译时 运行时)
c++·笔记