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

C++----STL(list)

介绍

list的数据结果是一个带头双向链表。

使用

有了前面string、vector的基础,后续关于list使用的讲解主要提及与string和vector的不同之处。

使用文档:cplusplus.com/reference/list/list/?kw=list

迭代器问题

insert以后迭代器不失效

#include <iostream>
#include <list>
#include <vector>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(10);lt.push_front(20);//在元素3的位置上插入30auto it = find(lt.begin(), lt.end(), 3);if (it != lt.end()){lt.insert(it, 30);// insert以后,it不失效*it *= 100;}return 0;
}

erase以后迭代器会失效

#define _CRT_SECURE_NO_EARNINGS 1
#include <iostream>
#include <list>
#include <vector>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(10);lt.push_front(20);//在元素3的位置上插入30auto it = find(lt.begin(), lt.end(), 3);if (it != lt.end()){lt.insert(it, 30);// insert以后,it不失效*it *= 100;}it = find(lt.begin(), lt.end(), 2);if (it != lt.end()){lt.erase(it);//erase以后,it失效了//*it *= 100;//error}return 0;
}

容器和迭代器类型

不同的容器在C++标准模板库(STL)中有不同的底层结构和迭代器类型。这些迭代器类型决定了容器支持哪些算法操作:

  • 单向迭代器:forward_list、unordered_map、unordered_set 这些容器仅支持向前遍历(即仅支持++操作)。
  • 双向迭代器:list、map、set 这些容器支持向前和向后遍历(即支持++和--操作)。
  • 随机访问迭代器:vector、string、deque 这些容器支持高效的随机访问(即支持++,--,+,-,以及比较操作)。

我们再通过vector和list的insert、erase来理解一下上面的讲解:

insert:

#include <iostream>
#include <list>
#include <vector>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(10);lt.push_front(20);vector<int> v = { 1,2,3,4,5 };//vector在第5个位置插入数据v.insert(v.begin() + 5, 100);//list在第5个位置插入数据//lt.insert(lt.begin() + 5, 100);//错误做法auto it = lt.begin();for (size_t i = 0; i < 5; i++){++it;}lt.insert(it, 100);return 0;
}

erase:

#include <iostream>
#include <list>
#include <vector>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);lt.push_front(10);lt.push_front(20);vector<int> v = { 1,2,3,4,5 };//vector删除第5个元素v.erase(v.begin() + 5);//list删除第5个元素//lt.erase(begin() + 5);//错误做法it = lt.begin();for (size_t i = 0; i < 5; i++) {++it;}lt.erase(it);return 0;
}

排序

sort

如果需要对一组数据sort排序,建议使用vector进行sort排序,而不要使用list,因为在数据量很大的情况下vector排序的效率远高于list。我们通过一个代码来验证一下:

void test_op()
{srand(time(0));const int N = 1000000;vector<int> v;v.reserve(N);list<int> lt1;list<int> lt2;for (int i = 0; i < N; ++i){auto e = rand();lt2.push_back(e);lt1.push_back(e);}// 拷贝到vector排序,排完以后再拷贝回来int begin1 = clock();// 先拷贝到vectorfor (auto e : lt1){v.push_back(e);}// 排序sort(v.begin(), v.end());// 拷贝回去size_t i = 0;for (auto& e : lt1){e = v[i++];}int end1 = clock();int begin2 = clock();lt2.sort();int end2 = clock();printf("vector sort:%d\n", end1 - begin1);printf("list sort:%d\n", end2 - begin2);
}

merge:合并排序

#include <iostream>
#include <list>
#include<algorithm>
using namespace std;void print(list<int> lt) {cout << "lt: ";for (auto e : lt) {cout << e << " ";}cout << endl;
}void test_merge(int a1[], int a2[],int len1,int len2) {sort(a1, a1 + len1);sort(a2, a2 + len2);list<int> lt(10);merge(a1, a1 + len1, a2, a2 + len2, lt.begin());print(lt);
}int main() {int first[] = { 5,10,15,20,25 };int second[] = { 50,40,30,20,10 };int len1 = sizeof(first) / sizeof(first[0]);int len2 = sizeof(second) / sizeof(second[0]);test_merge(first, second, len1, len2);return 0;
}

其他算法

unique:去重

#include <iostream>
#include <list>
#include<algorithm>
using namespace std;int main() {// 创建一个包含重复元素的 listlist<int> myList = { 1, 7, 2, 3, 4, 4, 4, 5, 6, 6 };// 注意:std::unique 需要已排序的容器myList.sort(); // 先排序auto lastUnique = unique(myList.begin(), myList.end());// 擦除重复的元素myList.erase(lastUnique, myList.end());// 打印去重后的 listfor (auto e : myList) {cout << e << ' ';}cout << endl;return 0;
}

remove:删除指定元素

int main() {list<int> mylist = { 9,89,23,67 };mylist.remove(89);for (auto e : mylist){cout << e << " ";}cout << endl;return 0;
}

splice:把一个链表的内容转移到另一个链表上

//splice(iterator pos, list& other)
//将整个源列表other的所有元素移动到目标列表的pos位置之前。源列表将变为空。
void test_splice1(list<int> mylist1,list<int> mylist2) {auto it = mylist1.begin();++it;                         // points to 2//mylist2全部转移到mylist1的第二个位置之前mylist1.splice(it, mylist2);cout << "spliced mulist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;
}//splice(iterator pos, list& other, iterator first)
//将源列表other中将 first 指向的元素移动到目标列表的pos位置之前。源列表中 first 元素将被移除。
void test_splice2(list<int> mylist1, list<int> mylist2) {auto it = mylist1.begin();++it;                         // points to 2// 部分转移// mylist2的++mylist2.begin()的元素转移到mylist1的第二个位置之前mylist1.splice(it, mylist2, ++mylist2.begin());cout << "spliced mulist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;
}//splice(iterator pos, list& other, iterator first, iterator last)
//将源列表other中从 first 到 last(不包括 last)之间的所有元素移动到目标列表的pos位置之前。源列表other中这部分元素将被移除
void test_splice3(list<int> mylist1, list<int> mylist2) {auto it = mylist1.begin();++it;                         // points to 2// mylist2的++mylist2.begin()之后的元素转移到mylist1的第二个位置之前mylist1.splice(it, mylist2, ++mylist2.begin(), mylist2.end());cout << "spliced mulist1: ";for (auto e : mylist1){cout << e << " ";}cout << endl;
}
int main() {list<int> mylist1, mylist2;list<int>::iterator it;// set some initial values:for (int i = 1; i <= 4; ++i)mylist1.push_back(i);      // mylist1: 1 2 3 4for (int i = 1; i <= 3; ++i)mylist2.push_back(i * 10);   // mylist2: 10 20 30test_splice1(mylist1,mylist2);test_splice2(mylist1,mylist2);test_splice3(mylist1,mylist2);return 0;
}

相关文章:

C++----STL(list)

介绍 list的数据结果是一个带头双向链表。 使用 有了前面string、vector的基础&#xff0c;后续关于list使用的讲解主要提及与string和vector的不同之处。 使用文档&#xff1a;cplusplus.com/reference/list/list/?kwlist 迭代器问题 insert以后迭代器不失效 #include…...

数据结构——AVL树的实现

Hello&#xff0c;大家好&#xff0c;这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容&#xff0c;AVL树属于是数据结构的一部分&#xff0c;顾名思义&#xff0c;AVL树是一棵特殊的搜索二叉树&#xff0c;我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点…...

知识图谱在个性化推荐中的应用:赋能智能化未来

目录 前言1. 知识图谱的基本概念2. 个性化推荐的挑战与知识图谱的优势2.1 个性化推荐的主要挑战2.2 知识图谱在个性化推荐中的优势 3. 知识图谱赋能推荐系统的具体实现3.1 数据增强与关系建模3.2 嵌入技术的应用3.3 图神经网络&#xff08;GNN&#xff09;的应用3.4 多模态数据…...

C语言自定义数据类型详解(一)——结构体类型(上)

什么是自定义数据类型呢&#xff1f;顾名思义&#xff0c;就是我们用户自己定义和设置的类型。 在C语言中&#xff0c;我们的自定义数据类型一共有三种&#xff0c;它们分别是&#xff1a;结构体(struct)&#xff0c;枚举(enum)&#xff0c;联合(union)。接下来&#xff0c;我…...

使用 Tailwind CSS + PostCSS 实现响应式和可定制化的前端设计

随着前端开发框架和工具的不断更新&#xff0c;设计和样式的管理已经成为前端开发中的一项核心任务。传统的 CSS 编写方式往往让样式的复用和可维护性变得困难&#xff0c;而 Tailwind CSS 和 PostCSS 作为当下流行的工具&#xff0c;提供了强大的功能来简化开发过程&#xff0…...

巧用多目标识别能力,帮助应用实现智能化图片解析

为了提升用户体验&#xff0c;各类应用正通过融合人工智能技术&#xff0c;致力于提供更智能、更高效的服务。应用不仅能通过文字和语音的方式与用户互动&#xff0c;还能深入分析图片内容&#xff0c;为用户提供精准的解决方案。 在解析图片之前&#xff0c;应用首先需要准确识…...

算法中的移动窗帘——C++滑动窗口算法详解

1. 滑动窗口简介 滑动窗口是一种在算法中常用的技巧&#xff0c;主要用来处理具有连续性的子数组或子序列问题。通过滑动窗口&#xff0c;可以在一维数组或字符串上维护一个固定或可变长度的窗口&#xff0c;逐步移动窗口&#xff0c;避免重复计算&#xff0c;从而提升效率。常…...

AcWing 3585:三角形的边 ← sort() 函数

【题目来源】 给定三个已知长度的边&#xff0c;确定是否能够构成一个三角形&#xff0c;这是一个简单的几何问题。 我们都知道&#xff0c;这要求两边之和大于第三边。 实际上&#xff0c;并不需要检验所有三种可能&#xff0c;只需要计算最短的两个边长之和是否大于最大那个就…...

阿里云-银行核心系统转型之业务建模与技术建模

业务领域建模包括业务建模和技术建模&#xff0c;整体建模流程图如下&#xff1a; 业务建模包括业务流程建模和业务对象建模 业务流程建模&#xff1a;通过对业务流程现状分析&#xff0c;结合目标核心系统建设能力要求&#xff0c;参考行业建 模成果&#xff0c;形成结构化的…...

MySQL核心知识:春招面试数据库要点

在前文中&#xff0c;我们深入剖析了MyBatis这一优秀的持久层框架&#xff0c;了解了它如何实现SQL语句与Java对象的映射&#xff0c;以及其缓存机制等重要内容。而作为数据持久化的核心支撑&#xff0c;数据库的相关知识在Java开发中同样至关重要。MySQL作为最流行的开源关系型…...

Hive之加载csv格式数据到hive

场景&#xff1a; 今天接了一个需求&#xff0c;将测试环境的hive数据导入到正式环境中。但是不需要整个流程的迁移&#xff0c;只需要迁移ads表 解决方案&#xff1a; 拿到这个需求首先想到两个方案&#xff1a; 1、将数据通过insert into语句导出&#xff0c;然后运行脚本 …...

Java web与Java中的Servlet

一。前言 Java语言大多用于开发web系统的后端&#xff0c;也就是我们是的B/S架构。通过浏览器一个URL去访问系统的后端资源和逻辑。 当我在代码里看到这个类HttpServletRequest 时 让我想到了Servlet&#xff0c;Servlet看上去多么像是Java的一个普通类&#xff0c;但是它确实…...

kafka常用目录文件解析

文章目录 1、消息日志文件&#xff08;.log&#xff09;2、消费者偏移量文件&#xff08;__consumer_offsets&#xff09;3、偏移量索引文件&#xff08;.index&#xff09;4、时间索引文件&#xff08; .timeindex&#xff09;5、检查点引文件&#xff08; .checkpoint&#x…...

RV1126+FFMPEG推流项目源码

源码在我的gitee上面&#xff0c;感兴趣的可以自行了解 nullhttps://gitee.com/x-lan/rv126-ffmpeg-streaming-projecthttps://gitee.com/x-lan/rv126-ffmpeg-streaming-project...

ANSYS SimAI

ANSYS SimAI 是 ANSYS 公司推出的一款基于人工智能&#xff08;AI&#xff09;的仿真解决方案&#xff0c;旨在通过机器学习技术加速仿真流程&#xff0c;降低计算资源需求&#xff0c;并为用户提供更高效的工程决策支持。其核心目标是简化复杂仿真过程&#xff0c;帮助工程师快…...

hedfs和hive数据迁移后校验脚本

先谈论校验方法&#xff0c;本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验&#xff0c;hdfs通过distcp迁移到另一个集群&#xff0c;怎么校验你的对不对。 有人会说&#xff0c;默认会有校验CRC校验。我们关闭了&#xff0c;为什么关闭&#xff1f;全量迁…...

蓝桥杯单片机(八)定时器的基本原理与应用

模块训练&#xff1a; 当有长定时情况时&#xff0c;也就是定时长度超过65.5ms时&#xff0c;采用多次定时累加 一、定时器介绍 1.单片机的定时/计数器 2.定时器工作原理 3.定时器相关寄存器 二、定时器使用程序设计 1.程序设计思路 与写中断函数一样&#xff0c;先写一个初…...

刷题总结 回溯算法

为了方便复习并且在把算法忘掉的时候能尽量快速的捡起来 刷完回溯算法这里需要做个总结 回溯算法的适用范围 回溯算法是深度优先搜索&#xff08;DFS&#xff09;的一种特定应用&#xff0c;在DFS的基础上引入了约束检查和回退机制。 相比于普通的DFS&#xff0c;回溯法的优…...

C++ 静态变量static的使用方法

static概述&#xff1a; static关键字有三种使用方式&#xff0c;其中前两种只指在C语言中使用&#xff0c;第三种在C中使用。 静态局部变量&#xff08;C) 静态全局变量/函数&#xff08;C) 静态数据成员/成员函数&#xff08;C&#xff09; 静态局部变量 静态局部变量&…...

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...