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 是一个双向链表实现,提供高效的插入和删除操作,适用于需要频繁在链表中间进行插入或删除的场景。
  • 不支持:随机访问,不能通过下标操作符访问元素。
  • 支持:双向迭代器,允许在链表中进行前向和后向遍历。
相关推荐
Ysjt | 深7 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__13 分钟前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞17 分钟前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货18 分钟前
Rust 的简介
开发语言·后端·rust
湫ccc26 分钟前
《Python基础》之基本数据类型
开发语言·python
Matlab精灵27 分钟前
Matlab函数中的隐马尔可夫模型
开发语言·matlab·统计学习
Microsoft Word28 分钟前
c++基础语法
开发语言·c++·算法
数据小爬虫@30 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
qq_1728055938 分钟前
RUST学习教程-安装教程
开发语言·学习·rust·安装
wjs20241 小时前
MongoDB 更新集合名
开发语言