在 C++ 标准模板库(STL)中,list 是一个非常重要的序列容器,它实现了双向链表的数据结构。与 vector 和 deque 不同,list 提供了高效的插入和删除操作,特别是在任意位置。本文将深入探讨 list 容器的特性、使用方法以及常见操作。

文章目录

  • 一、list 容器的基本特性
  • 二、list 的基本操作
    • 2.1 list的语法
    • 2.2 常用成员函数
    • 2.3 插入和删除操作
  • 三、list 的高级特性
    • 3.1 迭代器使用
    • 3.2 排序和去重
    • 3.3 合并和拼接
  • 四、list对比其它容器的优劣势
    • 4.1优势
    • 4.2劣势

一、list 容器的基本特性

list 是一个双向链表容器,它有下面5个特点:

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

  • 非连续内存:元素存储在任意内存位置,通过指针连接。

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

  • 不支持随机访问:不能像数组一样通过下标直接访问元素。

  • 迭代器稳定性:插入和删除操作不会使迭代器失效(除了被删除元素的迭代器)。

二、list 的基本操作

2.1 list的语法

  • 使用 list 前需要包含 头文件:
#include <iostream>
#include <list>
using namespace std;
  • 初始化一个空的 list
    list<int> lst1;
  • 初始化包含 5 个元素,每个元素值为 10
    list<int> lst2(5, 10);
  • 通过初始化列表初始化
    list<int> lst3 = {1, 2, 3, 4, 5};
  • 通过数组初始化
    int arr[] = {6, 7, 8, 9, 10};list<int> lst4(arr, arr + sizeof(arr)/sizeof(arr[0]));

2.2 常用成员函数

定义一个list作为示例,将为大家演示一些常用的成员函数及其使用方法。

list<int> myList = {1, 2, 3};
  • 在末尾添加元素
myList.push_back(4);  // 1,2,3,4
  • 在开头添加元素
myList.push_front(0); // 0,1,2,3,4
  • 获取第一个和最后一个元素
cout << "Front: " << myList.front() << endl; // 0
cout << "Back: " << myList.back() << endl;   // 4
  • 删除第一个和最后一个元素
myList.pop_front(); // 1,2,3,4
myList.pop_back();  // 1,2,3
  • 判断 list 是否为空
if (!myList.empty()) {cout << "List size: " << myList.size() << endl; // 3
}

2.3 插入和删除操作

list 的插入和删除操作非常高效,定义一个list作为示例:

list<int> nums = {10, 20, 30, 40};
  • 在指定位置前插入元素
auto it = nums.begin();
advance(it, 2); // 移动到第3个元素位置
nums.insert(it, 25); // 10,20,25,30,40
  • 删除指定位置的元素
it = nums.begin();
advance(it, 3);
nums.erase(it); // 10,20,25,40
  • 删除所有值为20的元素
nums.remove(20); // 10,25,40
  • 删除满足条件的元素
nums.remove_if([](int n){ return n > 30; }); // 10,25

三、list 的高级特性

3.1 迭代器使用

由于 list 不支持随机访问,遍历时必须使用迭代器。
我在这里定义一个string类型的list作为演示遍历时的操作。(其实主要还是迭代器遍历,但是范围for也可以。其实范围for内核本质就是迭代器啦)

list<string> names = {"Alice", "Bob", "Charlie"};
  • 使用迭代器遍历
for (auto it = names.begin(); it != names.end(); ++it) {cout << *it << " ";
}
cout << endl;
  • 使用范围for循环遍历
for (const auto& name : names) {cout << name << " ";
}
cout << endl;

3.2 排序和去重

list 中,库提供了专门的排序和去重成员函数,下面我创建一个int类型的list为大家一一演示其使用方法:

list<int> values = {3, 1, 4, 1, 5, 9, 2, 6};
  • 排序 (升序)
values.sort(); // 1,1,2,3,4,5,6,9
  • 降序排序
values.sort(greater<int>()); // 9,6,5,4,3,2,1,1
  • 去重 (必须先排序)
values.unique(); // 9,6,5,4,3,2,1
  • 自定义去重条件
values.unique([](int a, int b){ return abs(a-b) <= 1; });

3.3 合并和拼接

list 在合并和拼接提供了十分方便并且高效的库函数:

  • 定义两个list链表作为演示
list<int> list1 = {1, 3, 5};
list<int> list2 = {2, 4, 6};
  • 合并两个有序list (list2会被清空)
list1.merge(list2); // list1: 1,2,3,4,5,6; list2: 空list<int> list3 = {7, 8, 9};
  • 拼接list (将list3的元素移动到list1的指定位置)
auto pos = list1.begin();
advance(pos, 3);
list1.splice(pos, list3); // list1: 1,2,3,7,8,9,4,5,6

下次我们写算法题就可以不用像C语言那样那么麻烦了…(手动狗头)

四、list对比其它容器的优劣势

4.1优势

  • 适合频繁插入删除:当需要在序列中间频繁插入删除元素时,list 是最佳选择

  • 适合大元素对象:当元素对象很大时,list 可能比 vector 更高效,因为不需要重新分配和复制

  • 不需要随机访问:如果不需要通过下标快速访问元素

  • 迭代器稳定性高:需要保证插入删除操作不影响其他元素的迭代器

4.2劣势

    1. 内存开销大
      • list 作为链表结构,每个元素都需要额外的指针空间来存储前驱和后继节点的地址:
struct ListNode {T data;            // 存储的实际数据ListNode* prev;    // 指向前驱节点的指针ListNode* next;    // 指向后继节点的指针
};
    1. 缓存不友好
    • 链表节点分散在内存各处,无法利用空间局部性。

    • 遍历链表时几乎每次访问都会导致缓存缺失。

    • CPU 难以预测下一个节点的内存位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91395.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91395.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/91395.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day 28:类的定义和方法

DAY 28 类的定义和方法 知识点学习 1. 类的定义 在Python中&#xff0c;类是创建对象的模板。使用class关键字来定义一个类。类名通常采用首字母大写的命名方式&#xff08;PascalCase&#xff09;。 # 最简单的类定义 class MyClass:pass # 使用pass占位符类的定义就像是…

OSPF综合实验报告册

一、实验拓扑二、实验要求1、R4为ISP&#xff0c;其上只配置IP地址&#xff1b;R4与其他所直连设备间均使用公有IP&#xff1b; 2、R3-R5、R6、R7为MGRE环境&#xff0c;R3为中心站点&#xff1b; 3、整个OSPF环境IP基于172.16.0.0/16划分&#xff1b;除了R12有两个环回&#x…

网络层6——内部网关协议RIP、OSPF(重点)

目录 一、基本概念 1、理想的路由算法应具备的特点 2、分层次的路由选择协议 二、内部网关协议RIP 1、特点 2、路由交换信息 3、距离向量算法 4、坏消息传送慢问题 5、RIP报文格式 三、内部网关协议OSPF 1、特点 2、其他特点 3、自治系统区域划分 4、OSPF的5中分…

同品牌的系列广告要如何保证宣传的连贯性?

对于品牌的系列广告而言&#xff0c;内容的连贯性十分重要。如果系列广告之间缺乏内在联系&#xff0c;不仅会削弱品牌形象的统一性&#xff0c;还可能导致用户的认知混乱。保证宣传内容的连贯性不是让每则广告完全相同&#xff0c;而是在变化中保持核心要素的一致性。我们该如…

深度学习:激活函数Activaton Function

一、为什么需要激活函数&#xff1f;神经网络本质上是多个线性变换&#xff08;矩阵乘法&#xff09;叠加。如果没有激活函数&#xff0c;即使叠加多层&#xff0c;整体仍等价于一个线性函数&#xff1a;这样的网络无法学习和拟合现实世界中复杂的非线性关系。激活函数的作用&a…

deepseek: 切分类和长函数到同名文件中

import re import sys import os import ast from tokenize import generate_tokens, COMMENT, STRING, NL, INDENT, DEDENT import iodef extract_entities(filename):"""提取类和函数到单独文件"""with open(filename, r, encodingutf-8) as f…

新型融合肽递送外泌体修饰可注射温敏水凝胶用于骨再生

温敏水凝胶因能模拟细胞外基质微环境&#xff0c;且具有原位注射性和形态适应性&#xff0c;在骨组织工程中应用广泛。小肠黏膜下层&#xff08;SIS&#xff09;作为天然细胞外基质来源&#xff0c;富含 I 型和 III 型胶原蛋白及多种生物活性因子&#xff0c;其制备的水凝胶在组…

SPI接口的4种模式(根据时钟极性和时钟相位)

SPI&#xff08;Serial Peripheral Interface&#xff09; 接口根据时钟极性&#xff08;CPOL&#xff09;和时钟相位&#xff08;CPHA&#xff09;的不同组合&#xff0c;共有 4种工作模式。这些模式决定了数据采样和传输的时序关系&#xff0c;是SPI通信中必须正确配置的关键…

Java:高频面试知识分享2

HashSet 和 TreeSet 的区别&#xff1f;底层实现&#xff1a;HashSet 基于 HashMap 实现&#xff0c;使用哈希表存储元素&#xff1b;TreeSet 基于 TreeMap&#xff0c;底层为红黑树。元素顺序&#xff1a;HashSet 无序&#xff1b;TreeSet 会根据元素的自然顺序或传入的 Compa…

C语言习题讲解-第九讲- 常见错误分类等

C语言习题讲解-第九讲- 常见错误分类等1. C程序常见的错误分类不包含&#xff1a;&#xff08; &#xff09;2. 根据下面递归函数&#xff1a;调用函数 Fun(2) &#xff0c;返回值是多少&#xff08; &#xff09;3. 关于递归的描述错误的是&#xff1a;&#xff08; &#x…

A∗算法(A-star algorithm)一种在路径规划和图搜索中广泛使用的启发式搜索算法

A∗A*A∗算法&#xff08;A-star algorithm&#xff09;是一种在路径规划和图搜索中广泛使用的启发式搜索算法&#xff0c;它结合了Dijkstra算法的广度优先搜索思想和启发式算法的效率优势&#xff0c;能够高效地找到从起点到终点的最短路径。 1. 基本原理 A*算法的核心是通过估…

UniappDay06

1.填写订单-渲染基本信息 静态结构&#xff08;分包&#xff09;封装请求API import { http } from /utils/http import { OrderPreResult } from /types/orderexport const getmemberOrderPreAPI () > {return http<OrderPreResult>({method: GET,url: /member/orde…

论文略读:GINGER: Grounded Information Nugget-Based Generation of Responses

SIGIR 2025用户日益依赖对话助手&#xff08;如 ChatGPT&#xff09;来满足多种信息需求&#xff0c;这些需求包括开放式问题、需要推理的间接回答&#xff0c;以及答案分布在多个段落中的复杂查询RAG试图通过在生成过程中引入检索到的信息来解决这些问题但如何确保回应的透明性…

从内部保护你的网络

想象一下&#xff0c;你是一家高端俱乐部的老板&#xff0c;商务贵宾们聚集在这里分享信息、放松身心。然后假设你雇佣了最顶尖的安保人员——“保镖”——站在门口&#xff0c;确保你准确掌握所有进出的人员&#xff0c;并确保所有人的安全。不妨想象一下丹尼尔克雷格和杜安约…

Redis 中 ZipList 的级联更新问题

ZipList 的结构ZipList 是 Redis 中用于实现 ZSet 的压缩数据结构&#xff0c;其元素采用连续存储方式&#xff0c;具有很高的内存紧凑性。ZipList 结构组成如下&#xff1a;zlbytes&#xff1a;4字节&#xff0c;记录整个ziplist的字节数zltail&#xff1a;4字节&#xff0c;记…

【苍穹外卖项目】Day05

&#x1f4d8;博客主页&#xff1a;程序员葵安 &#x1faf6;感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb; 一、Redis入门 Redis简介 Redis是一个基于内存的 key-value 结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据&#xff08;热…

语音识别dolphin 学习笔记

目录 Dolphin简介 Dolphin 中共有 4 个模型&#xff0c;其中 2 个现在可用。 使用demo Dolphin简介 Dolphin 是由 Dataocean AI 和清华大学合作开发的多语言、多任务语音识别模型。它支持东亚、南亚、东南亚和中东的 40 种东方语言&#xff0c;同时支持 22 种汉语方言。该模…

视频生成中如何选择GPU或NPU?

在视频生成中选择GPU还是NPU&#xff0c;核心是根据场景需求、技术约束和成本目标来匹配两者的特性。以下是具体的决策框架和场景化建议&#xff1a; 核心决策依据&#xff1a;先明确你的“视频生成需求” 选择前需回答3个关键问题&#xff1a; 生成目标&#xff1a;视频分辨率…

从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践

文章目录 从豆瓣小组到深度洞察:一个基于Python的舆情分析爬虫实践 摘要 1. 背景 2. 需求分析 3. 技术选型与实现 3.1 总体架构 3.2 核心代码解析 4. 难点分析与解决方案 5. 总结与展望 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学:https://blog.csdn.net/weixin_…

RustDesk 使用教程

说明&#xff1a; 使用RustDesk 需要在不同的电脑安装对应系统型号的客户端&#xff0c;然后再去云服务器安装一个服务端即可。 1、到网站下载客户端&#xff1a;https://rustdesk.com/zh-cn/ 两台电脑安装客户端。 2、在云服务器安装服务端 1&#xff09;官网教程&#xff1a;…