C++STL容器之list

news/2025/2/23 16:51:22

1.介绍

        list是标准模版库(STL)提供的一个双向链表容器。它允许在常数时间内进行插入或删除操作,但不支持随机访问。(即不能通过下边直接访问元素)。list是一个序列容器,适合需要频繁插入和删除操作的场景。

2.list特性

  • 双向链表:每个元素都包含指向前一个和后一个元素的指针。

  • 高效的插入和删除:在任意位置插入和删除元素的时间复杂度为 O(1)。

  • 不支持随机访问:不能通过下标直接访问元素,必须通过迭代器遍历。

  • 内存开销较大:由于每个元素需要存储前后指针,内存占用比 vector 大。

3.list用法

        (1)定义与初始化

std::list<int> myList; // 定义一个空的整数链表
std::list<int> myList2 = {1, 2, 3, 4, 5}; // 初始化链表
std::list<int> myList3(5, 10); // 创建一个包含 5 个元素,每个元素为 10 的链表

        (2)插入元素

myList.push_back(10); // 在末尾插入 10

myList.push_front(5); // 在开头插入 5

auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第 2 个位置
myList.insert(it, 7); // 在第 2 个位置插入 7

        (3)删除元素

myList.pop_back(); // 删除末尾元素

myList.pop_front(); // 删除开头元素

auto it = myList.begin();
std::advance(it, 2); // 移动迭代器到第 2 个位置
myList.erase(it); // 删除第 2 个位置的元素
myList.remove(10); // 删除所有值为 10 的元素

        (4)访问元素

int firstElement = myList.front(); // 获取第一个元素
int lastElement = myList.back();  // 获取最后一个元素

        (5)遍历链表

for (auto it = myList.begin(); it != myList.end(); ++it) {
    std::cout << *it << " ";
}

for (int val : myList) {
    std::cout << val << " ";
}

        (6)其他操作

if (!myList.empty()) { //判断是否为空
    std::cout << "List size: " << myList.size() << std::endl;
}

myList.sort(); // 排序
myList.reverse(); // 反转
myList.clear(); // 清空链表

4.适用场景

  • 需要频繁在中间位置插入或删除元素。

  • 不需要随机访问元素。

  • 对内存占用不敏感。

如有错误,敬请指正!!!


http://www.niftyadmin.cn/n/5863595.html

相关文章

大规模 RDMA AI 组网技术创新:算法和可编程硬件的深度融合

目录 文章目录 目录大规模 RDMA 组网挑战算法和硬件深度融合拥塞控制算法方面的创新硬件卸载方面的创新 微软云 DCQCN 量化拥塞通知谷歌云 TIMELY 基于 RTT 的拥塞控制阿里云 HPCC 高精度拥塞控制AWS SRD 可扩展的可靠数据报协议 大规模 RDMA 组网挑战 随着 AI 大模型技术的兴…

Redis 基础命令 --- ZSet篇

实验环境 redis版本: 7.0.4一. 概述 Redis的ZSet是一个可排序的Set集合&#xff0c;ZSet中的每一个元素都带有一个score属性&#xff0c;可以基于score属性对元素排序&#xff0c;集合成员是唯一的&#xff0c;但是评分可以重复。 ZSet具备下列特性&#xff1a; 可排序元素…

代码随想录D52-53 图论 Python

目录 101. 孤岛的总面积 102. 沉没孤岛 103. 水流问题 104. 建造最大岛屿 101. 孤岛的总面积 要点&#xff1a; 整体来说是一个图着色的问题。 这道题目的思路符合直觉&#xff0c;但代码实现会和直觉有差别。如果仅使用visit记录不使用着色&#xff0c;会遇到非常多的…

免填邀请码工具:赋能六大核心场景,重构App增长新模型

在移动互联网流量红利逐渐消退的当下&#xff0c;用户转化漏斗中的每个环节都直接影响着App的商业价值。openinstall的免填邀请码工具&#xff0c;通过深度整合渠道归因与轻量化SDK方案&#xff0c;在用户首次打开App时即完成关键信息匹配&#xff0c;重构了传统用户增长模型。…

利用Postman和Apipost进行WebSocket调试和文档设计

在现代 Web 开发中&#xff0c;Websocket 作为一种常见的 Web 协议&#xff0c;与 Restful API 有着本质的不同。Restful API是基于请求-响应模式的单向通信&#xff0c;而 WebSocket 提供全双工通信渠道&#xff0c;允许客户端和服务器之间进行实时双向数据传输。这种特性使得…

MapReduce理论知识与实践

1. 什么是MapReduce MapReduce是一种分布式计算模型&#xff0c;用于处理大量数据。它由Google提出&#xff0c;广泛应用于大数据处理平台&#xff08;如Hadoop&#xff09;。MapReduce模型的核心思想是将任务分解成两个阶段&#xff1a;Map阶段和Reduce阶段。 Map阶段&#x…

JavaSE学习笔记25-反射(reflection)

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的机制&#xff0c;允许程序在运行时检查和操作类、方法、字段等信息。通过反射&#xff0c;可以动态地创建对象、调用方法、访问字段&#xff0c;甚至修改私有成员。反射的核心类是 java.lang.re…

Flutter开发的应用页面非常多时如何高效管理路由

文章目录 1. 集中式路由管理示例&#xff1a; 2. 动态路由生成 (onGenerateRoute)示例&#xff1a; 3. 模块化路由管理示例&#xff1a; 4. 使用路由管理库使用go_router的示例&#xff1a; 5. 路由分层管理总结 当Flutter应用中有大量页面时&#xff0c;路由管理变得复杂。为了…