当前位置: 首页 > article >正文

C++ STL(3)list

文章目录

  • 一、`list` 详解
    • 1、内存管理
    • 2、常用操作
    • 3、迭代器+erase()删除list中的元素

前言:

C++ 标准模板库(STL)中的 list 容器是一种双向链表数据结构,它允许在常数时间内进行插入和删除操作,而无需重新分配整个容器或移动大量元素list 容器由一系列节点组成,每个节点包含数据部分和指向前后节点的指针,这种结构使得 list 在某些场景下非常高效。本文将重点介绍 list 容器的内存存储机制及其常见用法。

一、list 详解

1、内存管理

list 容器的内存存储特点主要体现在以下几个方面:

  • 非连续存储: 与数组不同,list 的元素不存储在连续的内存块中。每个元素(节点)包含数据部分以及指向前后节点的指针。这种结构使得 list 能够灵活地在任意位置进行插入和删除操作。
  • 动态内存分配: 每次插入新元素时,list 会动态分配新的节点内存。这种机制避免了像 vector 那样在插入或删除元素时可能需要重新分配整个容器的内存,从而减少了内存碎片化的风险。
  • 双向链表: 每个节点包含两个指针,一个指向前一个节点(prev),另一个指向下一个节点(next)。这使得 list 能够在常数时间内向前或向后遍历。

2、常用操作

  • push_back(const T& value) 在 list 的末尾添加一个元素。
  • push_front(const T& value) 在 list 的开头添加一个元素。
  • pop_back() 移除 list 的最后一个元素。
  • pop_front() 移除 list 的第一个元素。
  • insert(iterator pos, const T& value) 在指定位置插入一个元素。
  • erase(iterator pos) 移除指定位置的元素。
  • erase(iterator first, iterator last) 移除指定范围内的元素。
  • clear() 移除 list 中的所有元素。
  • sort() 对 list 进行排序。
  • sort(Compare comp) 使用自定义比较函数对 list 进行排序。
  • reverse():反转 list 中元素的顺序。

3、迭代器+erase()删除list中的元素

std::list 是一个双向链表容器,它提供了 erase 成员函数来删除元素。这个函数接受一个迭代器作为参数,该迭代器指向要删除的元素。调用 erase 后,该元素会从 list 中移除,并且 erase 会返回一个指向被删除元素之后位置的迭代器(如果存在的话;如果删除的是最后一个元素,则返回 end())。

示例:

#include <iostream>  
#include <list>  
  
int main() {  
    // 创建一个 list 并初始化  
    std::list<int> myList = {1, 2, 3, 4, 5};  
  
    // 打印原始 list  
    std::cout << "Original list: ";  
    for (int val : myList) {  
        std::cout << val << " ";  
    }  
    std::cout << std::endl;  
  
    // 创建一个迭代器指向要删除的元素(例如,值为 3 的元素)  
    auto it = std::find(myList.begin(), myList.end(), 3);  
  
    // 检查是否找到了该元素  
    if (it != myList.end()) {  
        // 删除元素,并获取删除后下一个元素的迭代器  
        it = myList.erase(it); // 注意:这里我们更新了 it 的值  
  
        // 可选:打印删除后的 list  
        std::cout << "List after erasing 3: ";  
        for (int val : myList) {  
            std::cout << val << " ";  
        }  
        std::cout << std::endl;  
    } else {  
        std::cout << "Element 3 not found in the list." << std::endl;  
    }  
  
    // 注意:如果你不打算使用擦除后返回的迭代器(即不关心擦除后的下一个元素),  
    // 你也可以不更新 it,但之后不要使用它,因为它现在是一个无效迭代器。  
  
    return 0;  
}

http://www.kler.cn/news/329628.html

相关文章:

  • 卡夫卡的理解
  • 事务原理,以及MVCC如何实现RC,RR隔离级别的
  • 告别PPT熬夜!Kimi+AIPPT一键生成PPT,效率upup!
  • Docker全家桶:从0到加载本地项目
  • docker 部署 Seatunnel 和 Seatunnel Web
  • 浏览器用户行为集群建设-数仓建模-数据计算
  • 828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp
  • pytorch千问模型源码分析
  • leetcode.每日一题.2516.每种字符至少取 K 个
  • 【C++】C++基础
  • 魔都千丝冥缘——软件终端架构思维———未来之窗行业应用跨平台架构
  • D21【python接口自动化学习】-python基础之内置数据类型
  • Git记录
  • C语言:排序(1)
  • 毕业设计选题:基于ssm+vue+uniapp的家庭记账本小程序
  • 在线远程考试|基于springBoot的在线远程考试系统设计与实现(附项目源码+论文+数据库)
  • 【C++】“list”的介绍和常用接口的模拟实现
  • 进程通信——内存映射
  • Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(文档+源码+数据库)
  • [大语言模型-论文精读] 阿里巴巴-通过多阶段对比学习实现通用文本嵌入
  • 从0开始实现es6 promise类
  • 【可答疑】基于51单片机的体温心率血氧检测系统(含仿真、代码、报告等)
  • I2C-Tools的安装与使用方法(详解,一篇教会你熟练使用)
  • 数据库索引和磁盘的关系大揭秘
  • Leetcode 3307. Find the K-th Character in String Game II
  • 无线通信系统仿真与原型设计:MATLAB实践指南
  • LDRA Testbed(TBrun)软件集成测试(部件测试)_操作指南
  • postgresql僵尸进程的处理思路
  • 一文带你入门客制化键盘,打造专属打字利器
  • 大数据常问八股文面试题【数据倾斜,现象、本质原因、解决方案】