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 是一个双向链表实现,提供高效的插入和删除操作,适用于需要频繁在链表中间进行插入或删除的场景。
  • 不支持:随机访问,不能通过下标操作符访问元素。
  • 支持:双向迭代器,允许在链表中进行前向和后向遍历。
相关推荐
黎雁·泠崖3 分钟前
Java 包装类:基本类型与引用类型的桥梁详解
java·开发语言
三月微暖寻春笋4 分钟前
【和春笋一起学C++】(六十一)公有继承中的多态
c++·多态·virtual·基类·虚函数·公有继承
Java后端的Ai之路24 分钟前
微调模型成本太高,用RAG技术,低成本实现AI升级
开发语言·人工智能·python·rag·ai升级
2401_8769075228 分钟前
TYPE-C插拔力过大原因与解决方法
c语言·开发语言
一个处女座的程序猿O(∩_∩)O1 小时前
Python字典详解
开发语言·python
兩尛1 小时前
409. 最长回文串
c++·算法·leetcode
一个处女座的程序猿O(∩_∩)O1 小时前
Go语言Map值不可寻址深度解析:原理、影响与解决方案
开发语言·后端·golang
智者知已应修善业1 小时前
【pta反转加法构造回文数c语言1000位】2025-1-31
c语言·c++·经验分享·笔记·算法
汉克老师1 小时前
GESP2024年3月认证C++二级( 第三部分编程题(2)小杨的日字矩阵 )
c++·矩阵·循环结构·gesp二级·gesp2级·打印图形
yyjtx1 小时前
DHU上机打卡D27
c++·算法·图论