C++初学者指南-5.标准库(第二部分)--排序序列操作

news2024/11/16 0:37:20

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 ⇒ found
  cout << *i;  // 5
}
// find in entire vector
auto j = lower_bound(begin(v), end(v), 2);
if (j != end(v)) {  // true ⇒ found
  cout << *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 ⇒ found
  cout << *i;  // 6
}
// find in entire vector
auto j = upper_bound(begin(v), end(v), 2);
if (j != end(v)) {  // true ⇒ found
  cout << *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++ 之旅:容器和算法
算法概述表:
在这里插入图片描述

附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

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

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

相关文章

最“抠门”千亿儿媳,一件衣服穿五年!

文&#xff5c;琥珀食酒社 作者 | 积溪 我真是震惊了&#xff01; 刚刚刷奥运会 看解说员介绍称呼 说跳水名将郭晶晶和他的先生 我才知道霍家对郭晶晶的夸奖 绝非随口一说 她跟很多嫁入豪门的人 不一样 因为太“抠门”了 身为霍家儿媳妇 身价千亿的郭晶晶 一个头绳…

C++STL~~string

文章目录 一、string类的发展历史二、string的使用三、string的练习四、总结 一、string类的发展历史 在C 的早期版本中&#xff0c;处理字符串主要依赖于 C 风格的字符数组。但这种方式存在诸多不便&#xff0c;如手动管理内存、容易出现缓冲区溢出等问题。随着 C 标准的不断…

使用Linux实现FTP云盘1

关于FTP服务器 FTP&#xff08;文件传输协议&#xff09;服务器是在互联网上提供文件存储和访问服务的计算机&#xff0c;它们依照FTP 协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。 程序运行&#xff0c;服务端不断接收客户端指令&#xff0c;服务 端可同时处…

一文概叙自制舵机云台

本文主要涉及选择合适的舵机、设计云台结构、编写控制代码以及组装调试等步骤。以下是一个详细的制作流程&#xff1a; 一、材料准备 1、舵机&#xff1a; 通常需要至少两个舵机&#xff0c;一个用于控制云台的左右旋转&#xff0c;另一个用于控制云台的上下倾斜。先以简单的…

渲染引擎实践 - UnrealEngine引擎 GLContext 创建过程

一:概述: 本文分析下 UnrealEngine 启动过程中创建多少个 OpenGL Context,以及这些 Context 的作用。 二:临时Context 1. PreInit -> PreInitPreStartupScreen -> PreloadResolutionSettings, 用于检查图形窗口分辨率 2. PreInit -> PreInitPreStartupScreen -&…

高效清理优化工具 Sonoma Cache Cleaner mac 19.0.6注册激活版

Sonoma Cache Cleaner 是一款专为 Mac 系统设计的强大清理优化工具。它能够深度扫描系统&#xff0c;清理各类缓存文件&#xff0c;释放宝贵的存储空间。不仅如此&#xff0c;还能优化系统性能&#xff0c;让您的 Mac 运行更加流畅快捷。无论是系统日志、临时文件还是浏览器缓存…

ArcGIS基础:以分数形式进行标注字段

分数形式标注在项目或者工作中可能会用到 基于VBScript进行分式标注的通用形式为&#xff1a; "<und>"&""& 分子字段&""&"</und>"&vbNewLine& 分母字段按下述顺序进行操作标注 "<und…

VScode:前端项目中导出和导入插件

# 终端运行&#xff1a;导出扩展插件到指定路径&#xff08;txt&#xff09; code --list-extensions > C:\Users\UserName\Documents\extensions.txt # 终端运行&#xff1a;导入指定路径&#xff08;txt&#xff09;的扩展插件 Get-Content C:\Users\UserName\Documen…

【独家原创区间概率预测】CNN-BiLSTM-SEAttention-ABKDE多变量时序预测-区间预测

【独家原创区间概率预测】CNN-BiLSTM-SEAttention-ABKDE多变量时序预测-区间预测 基于卷积神经网络(CNN)结合双向长短期记忆网络(BiLSTM)结合SE注意力机制并结合自适应带宽核函数密度估计的多变量时序预测【点预测概率预测核密度估计】 程序已调试好&#xff0c;无需更改代码&a…

Leetcode每日刷题之面试题01.01.判断字符是否唯一

在学习编程语言的过程中相信大部分同学刚开始接触的循环语句都是 for 循环&#xff0c;今天我将介绍一个比较简洁的循环语句&#xff0c;可以帮助我们减少些许的代码量&#xff0c;也更加快捷&#xff0c;那就是范围 for 在我之前的博文中也有所介绍 详情点击&#xff1a;面向对…

React-Lines-Ellipsis:插件处理多行文本截断

实现自适应的多行文本截断并添加省略号。该项目依赖于CSS Flexbox布局&#xff0c;确保在各种屏幕尺寸和设备上都能正常工作&#xff0c;无需手动计算高度 安装 法1&#xff1a;使用插件react-lines-ellipsis &#xff08;适用范围&#xff1a;使用react的项目&#xff09; npm…

JarEditor:一款直接编辑修改 jar 包内文件IDEA 插件【送源码】

作为一名 Java 程序员&#xff0c;在维护一些古老的程序时&#xff0c;可能会遇到这种情况&#xff1a;项目依赖的 jar 包过于久远&#xff0c;已经没有源码了&#xff0c;但是有不得不修改的 bug 要处理。这时候就得想办法反编译 jar 包进行修改&#xff0c;并且重新打包&…

LeetCode 热题 HOT 100 (019/100)【宇宙最简单版】

【链表】No. 0142 环形链表 II【中等】&#x1f449;力扣对应题目指路 希望对你有帮助呀&#xff01;&#xff01;&#x1f49c;&#x1f49c; 如有更好理解的思路&#xff0c;欢迎大家留言补充 ~ 一起加油叭 &#x1f4a6; 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&#…

Redis数据失效监听

一、配置Redis开启 打开conf/redis.conf 文件&#xff0c;添加参数&#xff1a;notify-keyspace-events Ex 二、验证配置 步骤一&#xff1a;进入redis客户端&#xff1a;redis-cli步骤二&#xff1a;执行 CONFIG GET notify-keyspace-events &#xff0c;如果有返回值证明配…

初始化列表的基本介绍

为了树立初始化列表&#xff0c;我们先引进有参构造函数来理解 在上图的有参构造函数中我们可以将其转换为初始化列表&#xff0c;初始化列表有两种方式&#xff0c;一种是有参一种是无参&#xff0c;一会我会分别举例子&#xff0c;其语法为类名():属性&#xff08;值&#xf…

ffmpeg: 将flv格式的视频推流时报错: Failed to update header with correct duration

问题描述 我在将flv格式的视频推给rtmp服务器的时候&#xff0c;报错Failed to update header with correct duration&#xff0c;截图如下&#xff1a; 我的推流命令是 ffmpeg -stream_loop -1 -re -i wait-voice.flv -c:a copy -c:v copy -f flv rtmp://192.18.1.29:1935/…

C++入门知识点总结(下篇·初学必看)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;这篇文章将介绍下篇知识点内容&#xff0c;本系列文章将会更新关于C的全部初阶以及进阶的知识点&#xff0c;喜欢的小伙伴点个关注不迷路哦~我们一起来看看吧~ 目录 一、引用 &#x1f4ab; 1.1…

SAP 如何通过程序创建一个请求

一&#xff1a;首先我们需要知道SAP的资源类型 PGMID &#xff1a;程序ID OBJECT &#xff1a;对象类型 OBJ_NAME&#xff1a;对象名称 SY-REPID 我们可以通过SE09/SE10来创建一个请求号也能看的出来 也可以通过SE03来查找 请求号相关的数据都在E07*的表里这边…

IP 地址分类

IP 地址有两个版本&#xff1a; IPv4 和 IPv6 &#xff0c;目前使用最广泛的还是 IPv4 &#xff0c; IPv6 出现的目的主要是解决 IPv4 地址耗尽的问题。为了方便起见&#xff0c;在这里我们说的 IP 地址主要是指 IPv4 地址。 IP 地址是由 32 位比特组成&#xff0c;比如这个地…

初步认识二叉树

二叉树的概念及结构 二叉树在我们的想象中长这样 下图是满二叉树 二叉树有左右子树 1是根结点&#xff0c; 1的左子树是2&#xff0c;右子树是3&#xff1b; 2是根结点&#xff0c; 2的左子树是4&#xff0c;右子树是5&#xff1b; 3是根结点&#xff0c; 3的左子树是6…