C++STL初阶(7):list的运用与初步了解

在了解了vector之后,我们只需要简单学习List与vector不一样的接口即可

1.list的基本接口

1.1 iterator

list中,与vector最大的区别就是迭代器由随机迭代器变成双向迭代器

string和vector中的迭代器都是随机迭代器,支持+-等,而LIST的双向迭代器不支持双目运算+ -, 只支持弹幕运算++ --

vector中对于迭代器的解释:

list中对于迭代器的解释:双向带头链表(bidirectional iterator)

双向迭代器不支持+ -的原因:

效率低,毕竟链表无法随机访问 ,自然也无法方括号访问


1.2 sort

  由于排序算法的底层是快排,而快排不支持随机迭代器“RandomAccessIterator”

 并且双向迭代器不支持迭代器相减,快排中有一些三数取中的操作无法进行,所以不能使用std中的sort,否则在运行时会有运行错误:

因此链表中有自己的sort(底层是归并排序)

升序: 

     

降序(正如演示中的代码,链表的构造函数用法与vector一致):

1.3两个建议先排序再使用的函数:

li.unique();

li.merge(li1);

unique,即去重,将重复的元素去掉。

先排序,再去重,否则去不干净

 不排序就去重,在相同元素未连续的情况下是无法起到效果的

先降序:

merge,即合并

因为其原理是用双指针取小的尾差,所以先排序,再合并,就能将两个元素中一样的元素有序合并到一起

2.list中排序的效率问题

C语言数据结构基础——排序-CSDN博客

链表的排序复杂度和vector的排序复杂度都是O(nlogn)

但是vector的效率几乎稳定在list自带sort的2~5倍左右

测试代码:

void effciency_test() {srand(time(0));//初始化时间种子,避免伪随机数int N = 100000000;vector<int> v;for (int i = 0; i < N; ++i) {v.push_back(i + rand());}list<int> li;for (int i = 0; i < N; ++i) {li.push_back(rand() + i);}size_t begin1 = clock();sort(v.begin(), v.end());size_t end1 = clock();size_t begin2 = clock();li.sort();size_t end2 = clock();cout << "time of vector : " << end1 - begin1 << endl;cout << "time of list : " << end2 - begin2 << endl;
}

debug版本下,两倍左右: 

 realease版本下,五倍左右:

建议的方法是:先将链表的内容拷贝到一个vector,然后再对vector进行sort

     我们拷贝之后再进行测试:               

                  只有少量数据时,不太在乎效率的时候使用list自带的sort


3.结合splice(剪切函数)

中间的list& x表示会有元素被转出的链表 

注意,不是复制,就是把节点转移进去。

观察官网中的例子:

                       

这样操作之后,链表1就是1 10 20 30 2 3 4

链表2就是empty


由于其不存在复制的问题,我们还可以通过splice函数的功能将其自己的元素调换位置

测试函数:

void test_of_splice() {list<int> li1{ 1,2,3,4,5 };list<int> li2{ 1,2,3,4,5 };list<int> li3{ 1,2,3,4,5 };list<int> li{ 2,5,99,89,68 };li1.splice(li1.begin(), li);//entire list//li2.splice(li2.begin(), li, --li.end());//single element//li3.splice(li3.begin(), li, li.begin(), find(li.begin(), li.end(), 89));//element rangefor (auto e : li1) {cout << e << " ";}cout << endl;for (auto e : li) {cout << e << " ";}cout << endl;for (auto e : li) {cout << e << " ";}cout << endl;}

由于splice会让被移动的元素离开原链表,所以建议一次一次的测试。

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

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

相关文章

达梦数据库 MPP集群搭建(带主备)

MPP集群搭建&#xff08;带主备&#xff09; 1.背景2.操作内容和要求3. 具体步骤3.1 搭建过程3.1.1 集群搭建3.1.2 准备工作3.1.2.1 初始化3.1.2.2 备份数据库 3.1.3 配置主库EP013.1.3.1 配置dm.ini3.1.3.2 配置dmmal.ini3.1.3.3 配置dmarch.ini3.1.3.4 配置dmmpp.ctl3.1.3.5 …

Seata 面试题及答案整理,最新面试题

Seata 是如何解决分布式事务问题的? Seata通过事务协调器、事务管理器和资源管理器三个核心组件来解决分布式事务问题。 1、事务协调器(TC): TC作为全局事务的协调者,负责维护全局和分支事务的状态,并协调全局提交或回滚。 2、事务管理器(TM): TM负责定义全局事务的范…

百度文心大模型4.0 Turbo面向企业开放 多款旗舰模型降价

在2024年世界人工智能大会期间&#xff0c;百度副总裁谢广军宣布了文心一言4.0Turbo模型对企业用户的全面开放&#xff0c;并介绍了其定价策略。文心一言4.0Turbo的输入定价为0.03元/千Tokens&#xff0c;输出定价为0.06元/千Tokens。谢广军指出&#xff0c;如果按照3:1的输入输…

ArcGIS Pro SDK (九)几何 7 多点

ArcGIS Pro SDK &#xff08;九&#xff09;几何 7 多点 文章目录 ArcGIS Pro SDK &#xff08;九&#xff09;几何 7 多点1 构造多点 - 从映射点的枚举2 构造多点 - 使用 MultipointBuilderEx3 修改多点的点4 从多点检索点、2D 坐标、3D 坐标 环境&#xff1a;Visual Studio 2…

Golang | Leetcode Golang题解之第263题丑数

题目&#xff1a; 题解&#xff1a; var factors []int{2, 3, 5}func isUgly(n int) bool {if n < 0 {return false}for _, f : range factors {for n%f 0 {n / f}}return n 1 }

Linux云计算 |【第一阶段】SERVICES-DAY4

主要内容&#xff1a; DHCP概述、PXE批量装机、配置PXE引导、Kickstart自动应答、Cobbler装机平台 一、DHCP服务概述及原理 DHCP动态主机配置协议&#xff08;Dynamic Host Configuration Protocol&#xff09;&#xff0c;由IETF&#xff08;Internet网络工程师任务小组&…

Ruby教程

Ruby是一种动态的、面向对象的、解释型的脚本语言&#xff0c;以其简洁和易读性而闻名。Ruby的设计哲学强调程序员的生产力和代码的可读性&#xff0c;同时也融合了功能性和面向对象编程的特性。 以下是一个基础的Ruby教程&#xff0c;涵盖了一些基本概念和语法&#xff1a; …

IMU提升相机清晰度

近期&#xff0c;一项来自北京理工大学和北京师范大学的团队公布了一项创新性的研究成果&#xff0c;他们将惯性测量单元&#xff08;IMU&#xff09;和图像处理算法相结合&#xff0c;显著提升了非均匀相机抖动下图像去模糊的准确性。 研究团队利用IMU捕捉相机的运动数据&…

通过 EMR Serverless Spark 提交 PySpark 流任务

在大数据快速发展的时代&#xff0c;流式处理技术对于实时数据分析至关重要。EMR Serverless Spark提供了一个强大而可扩展的平台&#xff0c;它不仅简化了实时数据处理流程&#xff0c;还免去了服务器管理的烦恼&#xff0c;提升了效率。本文将指导您使用EMR Serverless Spark…

巧用Vue3 composition api的计算属性实现扁平化tree连线

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。将进一步把基于Vue3 composition api的computed计算属性特性应用到组件开发实战中&#xff0c;继续以最佳实践的方式呈现给大家。 下面我们要实现的是扁平化的dom结构所呈现的…

我去,怎么http全变https了

项目场景&#xff1a; 在公司做的一个某地可视化项目。 部署采用的是前后端分离部署&#xff0c;图片等静态资源请求一台minio服务器。 项目平台用的是http 图片资源的服务器用的是https 问题描述 在以https请求图片资源时&#xff0c;图片请求成功报200。 【现象1】: 继图…

IDEA性能优化方法解决卡顿

文章目录 前言一、可以采取以下措施&#xff1a;二、VM Options的参数解释1. 内存设置2. 性能调优3. GC&#xff08;垃圾回收&#xff09;调优4. 调试和诊断5. 其它设置6.设置 VM Options 的步骤&#xff1a; 总结 前言 我们在使用 IntelliJ IDEA的时候有时候会觉得卡顿&#x…

苹果电脑pdf合并软件 苹果电脑合并pdf 苹果电脑pdf怎么合并

在数字化办公日益普及的今天&#xff0c;pdf文件因其跨平台兼容性强、格式稳定等特点&#xff0c;已经成为工作、学习和生活中不可或缺的文件格式。然而&#xff0c;我们常常面临一个问题&#xff1a;如何将多个pdf文件合并为一个&#xff1f;这不仅有助于文件的整理和管理&…

Go解析JSON字符串到map或结构体

Go解析JSON字符串到map或结构体 解析JSON字符串到Go的map解析JSON字符串到Go的结构体 解析JSON字符串到Go的map package main import ( "encoding/json" "fmt" "log" ) func main() { // 假设这是你要解析的JSON字符串 jsonStr : {&qu…

阿里云服务器 篇三:提交搜索引擎收录

文章目录 系列文章推荐:为网站注册域名判断网站是否已被搜索引擎收录主动提交搜索引擎收录未查询到收录结果时,根据提示进行提交网站提交网站时一般需要登录账号主动提交网站可缩短爬虫发现网站链接时间,但不保证一定能够收录所提交的网站百度提交地址360搜索提交地址搜狗提…

最新!CSSCI(2023-2024)期刊目录公布!

【SciencePub学术】据鲁迅美术学院7月16日消息&#xff0c;近日&#xff0c;南京大学中国社会科学研究评价中心公布了中文社会科学引文索引&#xff08;CSSCI&#xff09;&#xff08;2023—2024&#xff09;数据库最新入选目录。 C刊一般指CSSCI来源期刊&#xff0c;即南大核心…

Python的列表操作有哪些

Python的列表操作非常丰富&#xff0c;包括列表的创建、元素的访问、修改、添加、删除、切片、排序等多个方面。以下是具体的列表操作&#xff1a; 一、列表的创建 使用方括号[]直接创建&#xff1a;可以直接在方括号中列出元素&#xff0c;元素之间用逗号分隔。例如&#xf…

Python 合并两个有序数组

Python 合并两个有序数组 正文 正文 题目说明如下&#xff1a; 这里我们直接让 nums1 的后 n 个数等于 nums2 数组&#xff0c;然后对 nums1 数组整体进行排序即可。 class Solution:def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:"…

​数据结构之初始二叉树(3)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 二叉树的基本操作 通过上篇文章的学习&#xff0c;我们简单的了解了二叉树的相关操作。接下来就是有…

uniapp上传功能用uni-file-picker实现

文章目录 html代码功能实现css样式代码 html代码 <uni-file-pickerselect"onFileSelected"cancel"onFilePickerCancel"limit"1"class"weightPage-upload-but"file-mediatype"image"></uni-file-picker><imag…