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()的相关介绍,令我有点迷糊,特意敲代码验了一下不同情况的调用结果。 《C标准库第2版》对list::merge()的相关介绍 list::merge()定义 merge()的作用就是将两个list合并在一起,函数有2个版本:…...
Quartz的分布式功能化设计
Quartz的分布式功能化设计 文章目录 Quartz的分布式功能化设计主体功能实现依赖API例子JOBJob记录表设计java具体代码DateDOOperatorDOSysQuartzJobDOPageDTOQuartzJobDTOQuartzJobPageDTOQuartzJobStatusEnumQuartzJobControllerIQuartzJobServiceQuartzJobServiceImplQuartzJ…...

Caffeine缓存
本地缓存基于本地环境的内存,访问速度非常快,对于一些变更频率低、实时性要求低的数据,可以放在本地缓存中,提升访问速度 使用本地缓存能够减少和Redis类的远程缓存间的数据交互,减少网络 I/O 开销,降低这…...
AI辅助研发正在成为造福人类的新生科技力量
目录 1.AI用于药物研发 (1)药物靶点预测: (2)药物分子设计: (3)药物筛选: (4)药效和安全性预测: (5)…...
程序分享--排序算法--归并排序
关注我,持续分享逻辑思维&管理思维; 可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导; 有意找工作的同学,请参考博主的原创:《面试官心得--面试前应该如何准备》,《面试官心得--面试时如何进行自…...
pg数据库和mysql区别
区别一 PostgreSQL (通常称为 PG) 和 MySQL 都是广泛使用的关系型数据库管理系统 (RDBMS)。虽然它们都是用于存储和管理数据的关系数据库,但它们在一些方面有很大的区别,如下所述: 数据类型: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报错: 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(或sql生成数据库) 主要技术: 基于C#wpf架构和sql server数据库 功能模块: 登录注册 鼓楼夜市管理系统主界面所有店铺信…...

【五、接口自动化测试】5分钟掌握python + requests接口测试
你好啊!我是山茶,一个持续探索AI 测试的程序员! 在做接口测试时,在python中内置了HTTP库 urllib,可以用于发送http请求。基于urllib二次封装的三方库Requests,相较于urllib更佳简介易用。所以,…...
双边市场的基本理论
双边市场由两个不同类型的用户组成,通过一个中介机构或平台进行交易,其中一边用户的决策会影响另一边用户的结果。这种影响被称为间接网络外部性,它导致了平台在吸引和平衡两边用户时面临的挑战。 平台定价在双边市场中成为核心问题…...

R统计学2 - 数据分析入门问题21-40
往期R统计学文章: R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算? 使用函数 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 个瓜,每个瓜的重量为 Ai 。 小蓝刀功了得,他可以把任何瓜劈成完全等重的两份,不过每个瓜只能劈一刀。 小蓝希望买到的瓜的重量的和恰好为 m 。 请问小蓝至少要劈多少个瓜才能买到重量恰好…...

生成式人工智能服务安全基本要求实务解析
本文尝试明晰《基本要求》的出台背景与实践定位,梳理《基本要求》所涉的各类安全要求,以便为相关企业遵循执行《基本要求》提供抓手。 引言 自2022年初以来,我国陆续发布算法推荐、深度合成与生成式人工智能服务相关的规范文件,…...
nginx详解,配置http,https,负载均衡,反向代理,SMTP 代理步骤说明
Nginx 是一款高性能的开源 Web 服务器,同时也可以用作反向代理服务器、负载均衡器、HTTP 缓存、HTTPS 中继、以及作为邮件代理服务器等。以下是 Nginx 可以实现的一些常见用途: 静态内容服务: Nginx 可以用来提供静态内容,比如 HTML、CSS、JavaScript 文件等。 动态内容服务…...

ARTS Week 20
Algorithm 本周的算法题为 1222. 可以攻击国王的皇后 在一个 下标从 0 开始 的 8 x 8 棋盘上,可能有多个黑皇后和一个白国王。 给你一个二维整数数组 queens,其中 queens[i] [xQueeni, yQueeni] 表示第 i 个黑皇后在棋盘上的位置。还给你一个长度为 2 的…...
python如何读取文件
这里的文件是txt文件,office文件不支持。 假如有一个pi_digits的txt文件,里面的内容是“3.1415926” 如果要读取这个文件的内容,需要调取pathlib模块,并把路径告知python。同时python文件必须要和目标读取文件在一个文件夹里。 …...

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

DataGrip 2023:让数据库开发变得更简单、更高效 mac/win
JetBrains DataGrip 2023是一款功能强大的数据库IDE,专为数据库开发和管理而设计。通过DataGrip,您可以连接到各种关系型数据库管理系统(RDBMS),并使用其提供的一组工具来查询、管理、编辑和开发数据库。 DataGrip 2023软件获取 DataGrip 2…...
突破编程_C++_设计模式(命令模式)
1 命令模式的基本概念 C 命令模式是一种设计模式,它允许将请求封装为一个对象,从而可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式的主要目的是将请求封装为对象,从而可…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...