C++初学者指南-5.标准库(第二部分)--排序序列操作
C++初学者指南-5.标准库(第二部分)–排序序列操作
文章目录
- C++初学者指南-5.标准库(第二部分)--排序序列操作
- 二分查找
- binary_search
- lower_bound
- upper_bound
- equal_range
- includes
- 合并
- merge
- inplace_merge
- 设置操作
- set_union
- set_intersection
- set_difference
- set_symmetric_difference
- 相关内容
不熟悉 C++ 的标准库算法? ⇒ 简介
前提条件:必须对输入序列进行排序。
任何排序序列算法都不会检查这一点。
二分查找
在一个包含N个元素的有序序列中查找一个元素可以在O(log N)的时间内完成。
在最坏的情况下,在一个无序序列中找到一个元素需要 N 步。
二分查找算法
binary_search

用二分查找算法在序列中查找一个值
cppreference
std::vector<int> v {1,2,3,4,5,6,7,8};
// search in subrange (as in image):
cout << binary_search(begin(v)+2, begin(v)+7, 4); // true
// search in entire vector:
cout << binary_search(begin(v), end(v), 8); // true
cout << binary_search(begin(v), end(v), 9); // false
运行示例程序

cppreference
lower_bound

返回序列中第一个不小于第三个参数值的迭代器,否则返回范围序列末尾位置迭代器。
cppreference
std::vector<int> v {0,1,2,3,4,5,6,7,8};
// find in subrange (as shown in image):
auto i = lower_bound(begin(v)+3, begin(v)+7, 5);
if (i != end(v)) { // true ⇒ foundcout << *i; // 5
}
// find in entire vector
auto j = lower_bound(begin(v), end(v), 2);
if (j != end(v)) { // true ⇒ foundcout << *j; // 2
}
运行示例代码

cppreference
upper_bound

返回序列中第一个大于第三个参数值的迭代器,否则返回范围序列末尾位置迭代器。
cppreference
std::vector<int> v {0,1,2,3,4,5,6,7,8};
// find in subrange (as shown in image):
auto i = upper_bound(begin(v)+3, begin(v)+7, 5);
if (i != end(v)) { // true ⇒ foundcout << *i; // 6
}
// find in entire vector
auto j = upper_bound(begin(v), end(v), 2);
if (j != end(v)) { // true ⇒ foundcout << *j; // 3
}
运行示例代码

cppreference
equal_range

在序列中查找第三个参数值,返回不小于此值的第一个元素的迭代器和第一个大于此值的第一个元素的迭代器对。
cppreference
std::vector<int> v {1,1,2,3,4,5,5,5,6,6,7,7,8};
// find in subrange (as shown in image):
auto r5 = equal_range(begin(v)+3, begin(v)+11, 5);
// erase range of '5'
v.erase(r5.first, r5.second);
for (int x : v) { cout << x << ' '; } // 1 1 2 3 4 6 6 7 7 8
// find in entire vector
auto r6 = equal_range(begin(v), end(v), 6);
// erase range of '6'
v.erase(r6.first, r6.second);
for (int x : v) { cout << x << ' '; } // 1 1 2 3 4 7 7 8
运行示例代码

cppreference
includes

如果范围1中可以找到范围2则返回true,否则返回false。
cppreference
std::vector<int> r1 {0,1,2,3,4,5,6,7};
std::vector<int> r2 {0,1,3,5,6,8,9};
// as shown in image
cout << includes(begin(r1), end(r1), begin(r2)+1, begin(r2)+5); // true
// entire r2 in r1?
cout << includes(begin(r1), end(r1), begin(r2), end(r2)); // true
运行示例代码

cppreference
合并
两个已排序的序列可以在线性时间内合并成一个排序序列。
合并算法
merge

cppreference
std::vector<int> in1 {0,2,4,6,7};
std::vector<int> in2 {1,3,5,8};
// make sure output can fit all elements
std::vector<int> out;
out.resize(in1.size() + in2.size());
merge(begin(in1), end(in1), begin(in2), end(in2), begin(out));
for (int x : out) { cout << x << ' '; } // 0 1 2 3 4 5 6 7 8
运行示例代码

inplace_merge

cppreference
std::vector<int> v {0,2,3,5,6,1,3,4,8};
inplace_merge(begin(v), begin(v)+5, end(v));
for (int x : v) { cout << x << ' '; } // 0 1 2 3 3 4 5 6 8
运行示例代码

cppreference
设置操作
像并集、交集等集合操作可以在排序列表上以线性时间进行,因此比在未排序列表上更快。
set_union

cppreference
std::vector<int> s1 {0,1,2,2,4,4,5};
std::vector<int> s2 {1,1,3,4,5};
// make sure output could fit all elements
std::vector<int> out;
out.resize(s1.size() + s2.size());
auto e = set_union(begin(s1), end(s1), begin(s2), end(s2), begin(out));
// shrink output to fit
out.erase(e, end(out));
for (int x : out) { cout << x << ' '; } // 0 1 1 2 2 3 4 4 5
运行示例代码

cppreference
set_intersection

cppreference
std::vector<int> s1 {1,2,4,6,7};
std::vector<int> s2 {2,3,4,7};
// make sure output could fit all elements
std::vector<int> out;
out.resize(std::max(s1.size(),s2.size()));
auto e = set_intersection(begin(s1), end(s1), begin(s2), end(s2), begin(out));
// shrink output to fit
out.erase(e, end(out));
for (int x : out) { cout << x << ' '; } // 2 4 7
运行示例代码

cppreference
set_difference

cppreference
std::vector<int> s1 {1,2,4,6,7};
std::vector<int> s2 {2,3,4,7};
// make sure output could fit all elements
std::vector<int> out;
out.resize(std::max(s1.size(),s2.size()));
auto e = set_difference(begin(s1), end(s1), begin(s2), end(s2), begin(out));
// shrink output to fit
out.erase(e, end(out));
for (int x : out) { cout << x << ' '; } // 1 6
运行示例代码

cppreference
set_symmetric_difference

cppreference
std::vector<int> s1 {1,2,4,6,7};
std::vector<int> s2 {2,3,4,7};
// make sure output could fit all elements
std::vector<int> out;
out.resize(std::max(s1.size(),s2.size()));
auto e = set_symmetric_difference(begin(s1), end(s1), begin(s2), end(s2), begin(out));
// shrink output to fit
out.erase(e, end(out));
for (int x : out) { cout << x << ' '; } // 1 3 6
运行示例代码

cppreference
相关内容
视频:binary_search, lower_bound, upper_bound by Conor Hoekstra
视频:set_union, set_difference, set_… by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:

附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^
相关文章:
C++初学者指南-5.标准库(第二部分)--排序序列操作
C初学者指南-5.标准库(第二部分)–排序序列操作 文章目录 C初学者指南-5.标准库(第二部分)--排序序列操作二分查找binary_searchlower_boundupper_boundequal_rangeincludes 合并mergeinplace_merge 设置操作set_unionset_intersectionset_differenceset_symmetric_difference …...
matplotlib库学习之绘图透明度设置(精炼准确)
matplotlib库学习之透明颜色设置 一、简介 在数据可视化中,透明度设置可以使图表更具层次感,特别是在多层叠加图表时。matplotlib库提供了多种方法来设置图表各个部分的透明度,包括图形、文本、图例、坐标轴等部分。 二、为什么要设置成透明…...
select多路复用(tcp通信)
文章目录 项目名称项目结构 项目名称 io_demo1 项目结构 $ tree . ├── build ├── CMakeLists.txt ├── debug.gdb ├── include │ ├── mysocket.h │ ├── tcp_client.h │ └── tcp_server.h ├── sources │ └── server.cpp └── src├─…...
STM32IIC与SPI详解
单片机里的通信协议其实蛮多的,IIC;SPI;MQTT;CAN;包括串口也是一种通信协议。而串口通信虽然实现了全双工,但需要至少三根线,为了节省这一根线的成本,于是IIC诞生了。 目录 一.IIC…...
K8s第三节:k8s1.23.1升级为k8s1.30.0
上回书说到我们使用了kubeadm安装了k8s1.23.1,但是在k8s1.24之前还是使用docker作为容器运行时,所以这一节我打算将我安装的k8s集群升级为1.30.0版本; 1、修改containerd 配置 因为我们安装的docker自带containerd,所以我们不需要重新安装con…...
.gitignore不生效的解决方案
为什么会不生效 因为文件已经被git追踪(或者说被track 或者说被索引,都是一个意思)。 目前.gitignore面对已经被git追踪的文件是无法生效的。(这是现状,我们只能接收这个现状。不过个人觉得git官方可以对这方面进行优化调整,让其…...
脱胎于 S 语言的R语言,Ross Ihaka 和 Robert Gentleman 和社区的力量让 R 在学术界与研究机构放光彩
R语言从一门用于统计学教学的编程语言,发展成为全球数据科学领域的重要工具,离不开其强大的功能、丰富的社区资源和开源精神。这些都离不开Ross Ihaka 和 Robert Gentleman 和 社区的力量。 在1990年代初,新西兰奥克兰大学的统计学教授Ross I…...
JavaEE 第6节 内存可见性问题以及解决方法
目录 一、什么是内存可见性问题? 1、问题代码演示 2、基础知识铺垫 1)硬件层面 2)模型层面(JMM) 二、内存可见性问题的原因 三、volatile解决内存可见性问题 一、什么是内存可见性问题? 1、问题代码…...
es基本操作
以下是一些 Elasticsearch 常用的命令,涵盖了索引管理、数据操作和集群管理等方面: 基本操作 检查集群状态: curl -X GET "localhost:9200/_cluster/health?pretty"查看集群健康状态和基本信息。 查看所有索引: curl…...
开源 AI 智能名片 S2B2C 商城小程序赋能下的社区团购商业模式研究
摘要:本文深入探讨了社区团购商业模式的本质、特点及其优势,并详细分析了开源 AI 智能名片 S2B2C 商城小程序在社区团购中的应用与价值。通过对相关案例的研究和数据的分析,揭示了这一创新组合对社区商业生态的重要影响,为未来社区…...
AutoSar AP软件规范中CM介绍及功能概要
1. 前言 为了理解AutoSar AP中EM的概念,生搬硬套的翻译了《 AUTOSAR SWS CommunicationManagement.pdf》的介绍部分,并按照自己的理解进行了修改。如下 2. AUTOSAR_SWS_CommunicationManagement.pdf的介绍部分 本文件包含AUTOSAR AP通信管理的功能、A…...
【图形学】TA之路-向量
向量 向量 是一个有大小和方向的数学对象。在三维空间中,向量通常表示为 (v_x, v_y, v_z)。 基本操作 加法: a b (a_x b_x, a_y b_y, a_z b_z)减法: a - b (a_x - b_x, a_y - b_y, a_z - b_z)标量乘法: k * v (k * v_x, …...
[flink]部署模式
部署模式 在一些应用场景中,对于集群资源分配和占用的方式,可能会有特定的需求。 Flink为各种场景提供了不同的部署模式,主要有以下三种:会话模式(Session Mode)、单作业模式(Per-Job Mode&…...
为什么不用postman做自动化
面试的时候被问到:为什么不用postman做自动化 打开postman,看到用例集管理、API 管理、环境管理这三个功能,用户体验感算得上品牌等级了 为什么不用呢,文心一言给了一些答案 不适合大规模自动化测试:Postman 主要是为…...
一、Matlab基础
文章目录 一、Matlab界面二、Matlab窗口常用命令三、Matlab的数据类型3.1 数值类型3.2 字符和字符串3.3 逻辑类型3.4 函数句柄3.5 结构类型3.6 细胞数组 四、Matlab的运算符4.1 算术运算符4.2 关系运算符4.3 逻辑运算4.4 运算符优先级 五、Matlab的矩阵5.1 矩阵的建立5.2 矩阵的…...
执行java -jar命令,显示jar中没有主清单属性
在Java中,一个"主清单属性"(Main-Class attribute)是指定JAR文件中包含的应用程序入口点,即包含main方法的类的完全限定名。如果你尝试运行一个没有主清单属性的JAR文件,你可能会看到错误消息,如…...
【C++进阶】红黑树
目录 什么是红黑树?红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树? 红黑树 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树ÿ…...
linux使用ssh连接一直弹出密码框问题
1.查看ssh服务的状态 输入以下命令: sudo service sshd status 小编已经安装了。 如果出现 Loaded: error (Reason: No such file or directory) 提示的话,说名没有安装ssh服务,按照第二步:安装ssh服务。 如果出现 Active: in…...
Python 3 数据结构
Python 3 数据结构 引言 Python 是一种高级编程语言,因其简洁明了的语法和强大的功能而广受欢迎。在 Python 中,数据结构是组织和存储数据的方式,对于编写高效和可维护的代码至关重要。本文将深入探讨 Python 3 中的主要数据结构࿰…...
【开源社区】Elasticsearch(ES)中空值字段 null_value 及通过exists查找非空文档
文章目录 0、声明1、问题描述2、问题剖析2.1 NULL或者空值类型有哪些2.2 案例讲解:尝试检索值为 null 的字段2.3 解决思路 3、使用 null_value 的诸多坑(避免生产事故)3.1 null_value 替换的是索引,并不会直接替换源数据3.2 不支持…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
