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 是一个双向链表实现,提供高效的插入和删除操作,适用于需要频繁在链表中间进行插入或删除的场景。
  • 不支持:随机访问,不能通过下标操作符访问元素。
  • 支持:双向迭代器,允许在链表中进行前向和后向遍历。
相关推荐
uppp»26 分钟前
深入理解 Java 反射机制:获取类信息与动态操作
java·开发语言
玩电脑的辣条哥2 小时前
Python如何播放本地音乐并在web页面播放
开发语言·前端·python
悄悄敲敲敲4 小时前
C++:dfs习题四则
c++·算法·深度优先
安於宿命5 小时前
【Linux】进程间通信——进程池
linux·c++
ll7788115 小时前
LeetCode每日精进:20.有效的括号
c语言·开发语言·算法·leetcode·职场和发展
Jackson@ML7 小时前
Python数据可视化简介
开发语言·python·数据可视化
赵琳琅7 小时前
Java语言的云计算
开发语言·后端·golang
lly2024067 小时前
jQuery 杂项方法
开发语言
赵琳琅7 小时前
MDX语言的安全开发
开发语言·后端·golang
开开又心心的学嵌入式7 小时前
C语言——指针进阶应用
c语言·开发语言