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

C++ std::list的merge()使用与分析

看到《C++标准库第2版》对list::merge()的相关介绍,令我有点迷糊,特意敲代码验了一下不同情况的调用结果。

《C++标准库第2版》对list::merge()的相关介绍

list::merge()定义

merge()的作用就是将两个list合并在一起,函数有2个版本:

  • c1.merge(c2)------------->这个版本含糊,将c2合入c1中,但合并后元素是怎么排序的呢?下文主要分析这个版本的不同调用结果
  • c1.merge(c2, op)--------->这个版本比较简单,就是将c2的内容合入到c1中,然后按op()排序

c1.merge(c2)调用情况分析

  • 前提:有两个list,内容分别如下:

  • 情况一:c1默认排序,c2不排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(); //默认升序排序myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后没有按c1的默认升序排序

  • 情况二:c1不排序,c2默认排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c2.sort(); //默认升序排序myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后没有按c2的默认升序排序

  • 情况三:c1默认排序,c2默认排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(); //默认升序排序c2.sort(); //默认升序排序myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后也能按默认升序排序

  • 情况四:c1默认排序,将c1赋值给c2,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(); //默认升序排序c2 = c1;myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:可以看到,c1赋值给c2,使得c2也具有了与c1一样的默认排序,两者合并后,仍能按默认升序排序,结果与情况三结果相似。


下面使用自定义的降序规则(op())来排序

    //降序比较auto op = [](int first, int second) {return first > second;};

情况五:c1自定义降序排序,c2不排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(op);myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后没有按c1的自定义降序排序,与情况一相似

情况六:c1不排序,c2自定义降序排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c2.sort(op);myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后没有按c2的自定义降序排序,与情况二相似

情况七:c1自定义降序排序,c2自定义降序排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(op);c2.sort(op);myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后,其结果仅仅是将c2放到了c1的末端,c1段、c2段数据仍是合并前的顺序,这与情况三有差异

 情况八:c1自定义降序排序,c2默认排序,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(op);c2.sort();myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

结果:合并后,没有按c1的自定义降序排序,也没有按c2的默认排序,与情况二相似

情况九:c1自定义降序排序,将c1赋值给c2,c2合入c1中

	list<int> c1{ 0,1,2,88,3,4 };list<int> c2{ 10,11,99,13,14,15 };cout << "-----------原始数据-----------" << endl;myPrinter(c1, c2);cout << "-----------排序后数据-----------" << endl;c1.sort(op);c2 = c1;myPrinter(c1, c2);cout << "-----------合并后数据-----------" << endl;c1.merge(c2);myPrinter(c1, c2);

 

结果:合并后,其结果仅仅是将c2放到了c1的末端,c1段、c2段数据仍是合并前的顺序,这与情况七相同,但与情况三有差异

结论

因为合并后的顺序情况多变,所以如果希望合并后结果按某种规则排序,建议使用c1.merge(c2, op),指明合并后的排序规则。

当然,如果c1,c2都是默认排序,则可以直接使用c1.merge(c2),即上文提到的情况三。

附:示例的辅助函数

template <class T>
void printfList(const T& _Container, const char* _Delim)
{std::copy(_Container.cbegin(), _Container.cend(), std::ostream_iterator<T::value_type>(cout, _Delim));cout << endl;
}void myPrinter(const list<int>& c1, const list<int>& c2)
{cout << "c1:";printfList(c1, " ");cout << "c2:";printfList(c2, " ");cout << "----------------------" << endl << endl;
}

相关文章:

C++ std::list的merge()使用与分析

看到《C标准库第2版》对list::merge()的相关介绍&#xff0c;令我有点迷糊&#xff0c;特意敲代码验了一下不同情况的调用结果。 《C标准库第2版》对list::merge()的相关介绍 list::merge()定义 merge()的作用就是将两个list合并在一起&#xff0c;函数有2个版本&#xff1a;…...

Quartz的分布式功能化设计

Quartz的分布式功能化设计 文章目录 Quartz的分布式功能化设计主体功能实现依赖API例子JOBJob记录表设计java具体代码DateDOOperatorDOSysQuartzJobDOPageDTOQuartzJobDTOQuartzJobPageDTOQuartzJobStatusEnumQuartzJobControllerIQuartzJobServiceQuartzJobServiceImplQuartzJ…...

Caffeine缓存

本地缓存基于本地环境的内存&#xff0c;访问速度非常快&#xff0c;对于一些变更频率低、实时性要求低的数据&#xff0c;可以放在本地缓存中&#xff0c;提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互&#xff0c;减少网络 I/O 开销&#xff0c;降低这…...

AI辅助研发正在成为造福人类的新生科技力量

目录 1.AI用于药物研发 &#xff08;1&#xff09;药物靶点预测&#xff1a; &#xff08;2&#xff09;药物分子设计&#xff1a; &#xff08;3&#xff09;药物筛选&#xff1a; &#xff08;4&#xff09;药效和安全性预测&#xff1a; &#xff08;5&#xff09…...

程序分享--排序算法--归并排序

关注我&#xff0c;持续分享逻辑思维&管理思维&#xff1b; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导&#xff1b; 有意找工作的同学&#xff0c;请参考博主的原创&#xff1a;《面试官心得--面试前应该如何准备》&#xff0c;《面试官心得--面试时如何进行自…...

pg数据库和mysql区别

区别一 PostgreSQL (通常称为 PG) 和 MySQL 都是广泛使用的关系型数据库管理系统 (RDBMS)。虽然它们都是用于存储和管理数据的关系数据库&#xff0c;但它们在一些方面有很大的区别&#xff0c;如下所述&#xff1a; 数据类型&#xff1a;PostgreSQL 支持更多的数据类型&#…...

Jetpack Compose 动画正式开始学习

1. 简单值动画 //将一个Color简单值 从一个值 变化到另一个 另一个简单值 就用 animateColorAsStateval backgroundColor by animateColorAsState(if (tabPage TabPage.Home) Purple100 else Green300) 动画其实就是 一个状态不停发生改变导致 组件不断重组产生的过程 2.…...

iOS 17.4报错: libopencore-amrnb.a[arm64]

iOS 17.4报错&#xff1a; libopencore-amrnb.a[arm64] iOS 17.4 模拟器运行报错解决方案 iOS 17.4 模拟器运行报错 Building for ‘iOS-simulator’, but linking in object file (/XXX/lib/libopencore-amrnb.a[arm64]2) built for ‘iOS’ 解决方案 在Podfile里添加如下设…...

鼓楼夜市管理wpf+sqlserver

鼓楼夜市管理系统wpfsqlserver 下载地址:鼓楼夜市管理系统wpfsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 登录注册 鼓楼夜市管理系统主界面所有店铺信…...

【五、接口自动化测试】5分钟掌握python + requests接口测试

你好啊&#xff01;我是山茶&#xff0c;一个持续探索AI 测试的程序员&#xff01; 在做接口测试时&#xff0c;在python中内置了HTTP库 urllib&#xff0c;可以用于发送http请求。基于urllib二次封装的三方库Requests&#xff0c;相较于urllib更佳简介易用。所以&#xff0c;…...

双边市场的基本理论

双边市场由两个不同类型的用户组成&#xff0c;通过一个中介机构或平台进行交易&#xff0c;其中一边用户的决策会影响另一边用户的结果。这种影响被称为间接网络外部性&#xff0c;它导致了平台在吸引和平衡两边用户时面临的挑战。 平台定价在双边市场中成为核心问题&#xf…...

R统计学2 - 数据分析入门问题21-40

往期R统计学文章&#xff1a; R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算&#xff1f; 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …...

蓝桥杯2023年-买瓜(dfs,类型转换同样耗时)

题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n 个瓜&#xff0c;每个瓜的重量为 Ai 。 小蓝刀功了得&#xff0c;他可以把任何瓜劈成完全等重的两份&#xff0c;不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…...

生成式人工智能服务安全基本要求实务解析

本文尝试明晰《基本要求》的出台背景与实践定位&#xff0c;梳理《基本要求》所涉的各类安全要求&#xff0c;以便为相关企业遵循执行《基本要求》提供抓手。 引言 自2022年初以来&#xff0c;我国陆续发布算法推荐、深度合成与生成式人工智能服务相关的规范文件&#xff0c;…...

nginx详解,配置http,https,负载均衡,反向代理,SMTP 代理步骤说明

Nginx 是一款高性能的开源 Web 服务器,同时也可以用作反向代理服务器、负载均衡器、HTTP 缓存、HTTPS 中继、以及作为邮件代理服务器等。以下是 Nginx 可以实现的一些常见用途: 静态内容服务: Nginx 可以用来提供静态内容,比如 HTML、CSS、JavaScript 文件等。 动态内容服务…...

ARTS Week 20

Algorithm 本周的算法题为 1222. 可以攻击国王的皇后 在一个 下标从 0 开始 的 8 x 8 棋盘上&#xff0c;可能有多个黑皇后和一个白国王。 给你一个二维整数数组 queens&#xff0c;其中 queens[i] [xQueeni, yQueeni] 表示第 i 个黑皇后在棋盘上的位置。还给你一个长度为 2 的…...

python如何读取文件

这里的文件是txt文件&#xff0c;office文件不支持。 假如有一个pi_digits的txt文件&#xff0c;里面的内容是“3.1415926” 如果要读取这个文件的内容&#xff0c;需要调取pathlib模块&#xff0c;并把路径告知python。同时python文件必须要和目标读取文件在一个文件夹里。 …...

InnoDB和MyISAM存储引擎

InnoDB mysql默认存储引擎 支持事务&#xff0c;行级锁&#xff08;并发量大&#xff09;&#xff0c;外键约束&#xff0c;容量大&#xff0c;支持缓存&#xff0c;支撑主键自增&#xff0c; 全文检索&#xff0c;不存储表的总行数&#xff0c;需要sql逐行统计 MyISAM 不…...

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win

JetBrains DataGrip 2023是一款功能强大的数据库IDE&#xff0c;专为数据库开发和管理而设计。通过DataGrip&#xff0c;您可以连接到各种关系型数据库管理系统(RDBMS)&#xff0c;并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023软件获取 DataGrip 2…...

突破编程_C++_设计模式(命令模式)

1 命令模式的基本概念 C 命令模式是一种设计模式&#xff0c;它允许将请求封装为一个对象&#xff0c;从而可以用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。命令模式的主要目的是将请求封装为对象&#xff0c;从而可…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

路由基础-路由表

本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中&#xff0c;往往存在多个不同的IP网段&#xff0c;数据在不同的IP网段之间交互是需要借助三层设备的&#xff0c;这些设备具备路由能力&#xff0c;能够实现数据的跨网段转发。 路由是数据通信网络中最基…...

python打卡第47天

昨天代码中注意力热图的部分顺移至今天 知识点回顾&#xff1a; 热力图 作业&#xff1a;对比不同卷积层热图可视化的结果 def visualize_attention_map(model, test_loader, device, class_names, num_samples3):"""可视化模型的注意力热力图&#xff0c;展示模…...