C++初学者指南-5.标准库(第一部分)--标准库查找算法

C++初学者指南-5.标准库(第一部分)–标准库查找算法

文章目录

  • C++初学者指南-5.标准库(第一部分)--标准库查找算法
    • 查找/定位一个元素
      • find
      • find_if
      • find_if_not
      • find_last / find_last_if / find_last_if_not
      • find_first_of
    • 查找范围内的子范围
      • search
      • find_end
      • starts_with
      • ends_with
    • 找到连续相等元素序列
      • adjacent_find
      • search_n
    • 相关内容

不熟悉 C++ 的标准库算法? ⇒ 简介

查找/定位一个元素

find

在这里插入图片描述
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference
在这里插入图片描述
运行示例代码

在这里插入图片描述
返回第一个等于value的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference

std::vector<int> v {4,1,3,8,5,8,2};
auto i = std::ranges::find(v, 8);
if (i != end(v)) {   // true ⇒ foundauto const value = *i;  // int value = 8auto const index = distance(begin(v), i);  // index = 3
}

运行示例代码

find_if

在这里插入图片描述
返回第一个在 f 中返回true的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference

std::vector<int> v {9,0,4,1,8,3,7,2,9};
auto const f = [](int x) { return x >= 6; };
// 在子范围中查找(如图所示):
auto i = find_if (begin(v)+2, begin(v)+7, f);
// i != end-of-range?
if (i != begin(v)+7) {  // true ⇒ foundauto const value = *i;  // int value = 8
}
// 在整个vector中查找:
auto j = find_if (begin(v), end(v), f);
if (j != end(v)) {   // true ⇒ foundauto const value = *j;  // int value = 9auto const index = distance(begin(v), j);  // index = 0
}

运行示例代码

在这里插入图片描述
返回第一个在 f 中返回true的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference

std::vector<int> v {4,1,8,3,7};
auto const f = [](int x) { return x >= 6; };
auto i = std::ranges::find_if (v, f);  
if (i != end(v)) {   // true ⇒ foundauto const value = *i;  // int value = 8auto const index = distance(begin(v), i);  // index = 2
}

运行示例代码

find_if_not

在这里插入图片描述
返回第一个在 f 中返回false的元素的迭代器
没有找到则返回@end位置的迭代器
cppreference

std::vector<int> v {9,0,4,1,3,0,5,2,9};
auto const f = [](int x) { return x >= 2; };
// 在子范围中查找(如图所示):
auto i = find_if_not(begin(v)+2, begin(v)+7, f);
// i != end-of-range?
if (i != begin(v)+7) {  // true ⇒ foundauto const value = *i;     // int value = 1
}
// 在整个vector中查找:
auto j = find_if_not(begin(v), end(v), f);
if (j != end(v)) {   // true ⇒ foundauto const value = *j;  // int value = 0auto const index = distance(begin(v), j);  // index = 1
}

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> v {4,1,3,0};
auto const f = [](int x) { return x >= 2; };
auto i = std::ranges::find_if_not(v, f);  
if (i != end(v)) {   // true ⇒ foundauto const value = *i;  // int value = 1auto const index = distance(begin(v), i);  // index = 1
}

运行示例代码

find_last / find_last_if / find_last_if_not

在这里插入图片描述
返回输入范围内的最后一个和value相等的元素的视图,视图为空则没有找到

cppreference

std::vector<int> v {2,1,7,1,1,5,8};
// 注意:可能尚未可用
// 在很多标准库的实现中!
auto const result = std::ranges::find_last(v, 1);
if (not result.empty()) {   // if foundauto const value = result.front();  // int value = 1auto const index = distance(begin(v),begin(result));  // index = 4
}
for (int x : result) { cout << x << ' '; }  // 1 5 8

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> v {4,1,3,8,1};
auto const f = [](int x) { return x >= 2; };
// 注意:可能尚未可用
// 在很多标准库的实现中!
auto const result = std::ranges::find_last_if (v, f);  
if (not result.empty()) {   // if foundauto const value = result.front();  // int value = 8auto const index = distance(begin(v),begin(result));  // index = 3
}
for (int x : result) { cout << x << ' '; }  // 8 1

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> v {4,0,3,1,5};
auto const f = [](int x) { return x >= 2; };
// 注意:可能尚未可用
// 在很多标准库的实现中!
auto const result = std::ranges::find_last_if_not(v, f);  
if (not result.empty()) {   // if foundauto const value = result.front();  // int value = 1auto const index = distance(begin(v),begin(result));  // index = 3
}
for (int x : result) { cout << x << ' '; }  // 1 5

运行示例代码

find_first_of

在这里插入图片描述
返回一个迭代器,指向范围s中与范围w中任何元素相等的第一个元素;如果没有找到这样的元素,则返回@send位置的迭代器。
cppreference

std::vector<int> s {0,1,3,2,5,7,4,8,9,9};
std::vector<int> w {1,4,6,5,8,7};
// 在子范围内查找,如图所示:
auto i = find_first_of(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4);
// i != end-of-range?
if (i != begin(s)+9) {  // true ⇒ found oneauto const value = *i;     // int value = 5auto const index = distance(begin(s), i);  // index = 4
}
// 在s中查找w中的任意元素:
auto j = find_first_of(begin(s), end(s), begin(w), end(w));
if (j != end(s)) {   // true ⇒ found oneauto const value = *j;  // int value = 1auto const index = distance(begin(s), j);  // index = 1
}

运行示例程序

在这里插入图片描述
返回一个迭代器,指向范围s中与范围w中的任何元素相等的第一个元素;如果没有找到这样的元素,则返回@end(s)。
cppreference

std::vector<int> s {3,2,5,7,4,8};
std::vector<int> w {4,6,5};
auto i = std::ranges::find_first_of(s, w);  
if (i != end(s)) {   // true ⇒ found oneauto const value = *i;  // int value = 5auto const index = distance(begin(s), i);  // index = 2
}

运行示例代码

查找范围内的子范围

search

在这里插入图片描述
如果在S的子范围内具有指定的W范围内的子范围,则返回S子范围内此查找到的第一个子范围的第一个元素的迭代器,否则返回S子范围的末尾迭代器。
cppreference

std::vector<int> s {0,4,6,5,1,4,6,5,8,9};
std::vector<int> w {1,4,6,5,8,9};
//在's'的子范围中找到'w'的子范围(如图所示):
auto i = search(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4);
// i != end-of-range?
if (i != begin(s)+9) {  // true ⇒ foundauto const value = *i;     // int value = 4auto const index = distance(begin(s), i);  // index = 1
}
// 在's'中找到所有的'w':
auto j = search(begin(s), end(s), begin(w), end(w));
if (j != end(s)) {   // true ⇒ foundauto const value = *j;  // int value = 1auto const index = distance(begin(s), j);  // index = 4
}

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> s {1,4,6,5,8,4,6,5};
std::vector<int> w {4,6,5};
auto r = std::ranges::search(s, w);  
if (not empty(r)) {for (int x : r) { cout << x << ' '; }  // 4 6 5
}

运行示例代码

find_end

在这里插入图片描述
如果在S的子范围内具有指定的W范围内的子范围,则返回S子范围内此查找到的最后一个子范围的第一个元素的迭代器,否则返回S子范围的末尾迭代器。
cppreference

std::vector<int> s {0,4,6,5,1,4,6,5,8,9};
std::vector<int> w {1,4,6,5,8,9};
// 在's'的子范围中找到'w'的子范围(如图所示):
auto i = find_end(begin(s)+1, begin(s)+9, begin(w)+1, begin(w)+4);
// i != end-of-range?
if (i != begin(s)+9) {  // true ⇒ foundauto const value = *i;     // int value = 4auto const index = distance(begin(s), i);  // index = 5
}
// 在所有的's'中找到所有的'w':
auto j = find_end(begin(s), end(s), begin(w), end(w));
if (j != end(s)) {   // true ⇒ foundauto const value = *j;  // int value = 1auto const index = distance(begin(s), j);  // index = 4
}

运行此示例代码

在这里插入图片描述
cppreference

std::vector<int> s {1,4,6,5,8,4,6,5};
std::vector<int> w {4,6,5};
auto r = std::ranges::find_end(s, w);  
if (not empty(r)) {for (int x : r) { cout << x << ' '; }  // 4 6 5
}

运行次示例代码

starts_with

在这里插入图片描述
cppreference

std::vector<int> s {0,4,8,6,2,1,9};
std::vector<int> w {9,4,8,6,7,3};
// 注意:可能尚未可用
// 在很多标准库的实现中!
if (std::ranges::starts_with(begin(s)+1, begin(s)+6, begin(w)+1, begin(w)+4) ) {cout << "yes!\n";
}

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> s {4,6,5,8,7,3};
std::vector<int> w {4,6,5};
// 注意:可能尚未可用
// 在很多标准库的实现中!
if (std::ranges::starts_with(s, w) ) {cout << "yes!\n";
}

运行示例代码

ends_with

在这里插入图片描述
cppreference

std::vector<int> s {0,4,8,6,2,1,9};
std::vector<int> w {9,6,2,1,7,3};
// 注意:可能尚未可用
// 在很多标准库的实现中!
if (std::ranges::ends_with(begin(s)+1, begin(s)+6, begin(w)+1, begin(w)+4) ) {cout << "yes!\n";
}

运行示例代码

在这里插入图片描述
cppreference

std::vector<int> s {4,6,5,8,7,3};
std::vector<int> w {8,7,3};
// 注意:可能尚未可用
// 在很多标准库的实现中!
if (std::ranges::ends_with(s, w) ) {cout << "yes!\n";
}

运行示例代码

找到连续相等元素序列

adjacent_find

在这里插入图片描述
返回第一个连续相等元素范围的第一个元素的迭代器
如果没有则返回范围的末尾迭代器
可以作为第三个参数传递一个自定义的函数(对象)来比较元素

std::vector<int> v {5,5,2,8,2,2,3,3,2,8};
// 在子范围中查找,如图所示:
auto i = adjacent_find(begin(v)+1, begin(v)+8);
// i != end-of-range?
if (i != begin(v)+8) {  // true ⇒ foundauto const value = *i;     // int value = 2auto const index = distance(begin(v), i);  // index = 4
}
// 在整个vector中查找:
auto j = adjacent_find(begin(v), end(v));
if (j != end(v)) {   // true ⇒ foundauto const value = *j;  // int value = 5auto const index = distance(begin(v), j);  // index = 0
}

运行示例代码

在这里插入图片描述
用于比较元素的自定义函数(对象)可以作为第二个参数传递
cppreference

std::vector<int> v {5,2,8,2,2,3,3};
auto i = std::ranges::adjacent_find(v);  
if (i != end(v)) {   // true ⇒ foundauto const value = *i;  // int value = 2auto const index = distance(begin(v), i);  // index = 3
}

运行示例代码

search_n

在这里插入图片描述
返回n个连续值为value的序列的第一次出现的第一个元素位置的迭代器
如果没有则范围子范围末尾位置的迭代器
用于比较元素的自定义函数(对象)可以作为第 5 个参数传递
cppreference

std::vector<int> v {0,5,2,2,8,2,2,2,9,9,9};
// 在子范围内找到3个2的连续出现(如图所示):
const auto n = 3;
auto i = search_n(begin(v)+1, begin(v)+9, n, 2);
// i != end-of-range?
if (i != begin(v)+9) {  // true ⇒ foundauto const value = *i;     // int value = 2auto const index = distance(begin(v), i);  // index = 5
}
// 在整个向量中寻找连续的3个9:
auto j = search_n(begin(v), end(v), n, 9);
if (j != end(v)) {   // true ⇒ foundauto const value = *j;  // int value = 9auto const index = distance(begin(v), j);  // index = 8
}

运行示例代码

在这里插入图片描述
用于比较元素的自定义函数(对象)可以作为第四个参数传递
cppreference

std::vector<int> v {2,2,8,2,2,2,9};
const auto n = 3;
auto r = std::ranges::search_n(v, n, 2);  
if (not empty(r)) {   // true ⇒ foundauto const value = r[0];  // int value = 2auto const index = distance(begin(v), begin(r));  // index = 3
}

运行示例代码

相关内容

视频:adjacent_find by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

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

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

相关文章

SpringBoot3 + Vue3 学习 Day 2

登入接口 和 获取用户详细信息的开发 学习视频登入接口的开发1、登入主逻辑2、登入认证jwt 介绍生成 JWT① 导入依赖② 编写代码③ 验证JWT 登入认证接口的实现① 导入 工具类② controller 类实现③ 存在的问题及优化① 编写拦截器② 注册拦截器③ 其他接口直接提供服务 获取用…

Web3D:WebGL为什么在渲染性能上输给了WebGPU。

WebGL已经成为了web3D的标配&#xff0c;市面上有N多基于webGL的3D引擎&#xff0c;WebGPU作为挑战者&#xff0c;在渲染性能上确实改过webGL一头&#xff0c;由于起步较晚&#xff0c;想通过这个优势加持&#xff0c;赶上并超越webGL仍需时日。 贝格前端工场为大家分享一下这…

Webstorm-恢复默认UI布局

背景 在使用Webstorm的时候,有时候进行个性化设置,如字体、界面布局等. 但是设置后的效果不理想,想要重新设置回原来的模样,却找不到设置项. 这里提供一种解决方案,恢复默认设置,即恢复到最初刚下载好后的设置. 操作步骤 步骤一:打开setting 步骤二:搜索Restore Default,找到…

数学建模-----SPSS参数检验和非参数检验

目录 1.参数检验 1.1独立样本t检验案例分析 1.1.1查看数据编号 1.1.2确定变量所属类型 1.1.3选项里面的置信区间 1.1.4对于结果进行分析 1.2配对样本t检验案例分析 1.2.1相关设置 1.2.2分析结果 2.非参数检验 2.1对比分析 2.2非参数检验的方法 2.3案例分析 2.3.1相…

10道JVM经典面试题

1、 JVM中&#xff0c;new出来的对象是在哪个区&#xff1f; 2、 说说类加载有哪些步骤&#xff1f; 3、 JMM是什么&#xff1f; 4、 说说JVM内存结构&#xff1f; 5、 MinorGC和FullGC有什么区别&#xff1f; 6、 什么是STW? 7、 什么情况下会发生堆/栈溢出&#xff1f…

当“广撒网”遇上“精准定点”的鱼叉式网络钓鱼

批量网络钓鱼电子邮件活动倾向于针对大量受众&#xff0c;它们通常使用笼统的措辞和简单的格式&#xff0c;其中不乏各种拼写错误。而有针对性的攻击往往需要付出更大的努力&#xff0c;攻击者会伪装成雇主或客户向目标发送包含个人详细信息的个性化消息。在更大范围内采用这种…

大语言模型-文本检索任务基准 BEIR

BEIR (A Heterogeneous Benchmark for Zero-shot Evaluation of Information Retrieval Models) 文本检索任务的基准&#xff0c;使用18 个数据集为检索系统的零样本评估提出了一个标准化基准&#xff0c; BEIR 基准上在9个不同领域的检索任务评估 10 种不同的检索方法。 九个…

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …

2.1.卷积层

卷积 ​ 用MLP处理图片的问题&#xff1a;假设一张图片有12M像素&#xff0c;那么RGB图片就有36M元素&#xff0c;使用大小为100的单隐藏层&#xff0c;模型有3.6B元素&#xff0c;这个数量非常大。 识别模式的两个原则&#xff1a; 平移不变性&#xff08;translation inva…

K8S 部署jaeger-operator,与其演示项目hotrod

最近在研究observabilty在K8S环境的onboard&#xff0c;查阅了一些资料&#xff0c;发现现在网上Prometheus/Metrics相关的资源&#xff0c;是比较全面的&#xff0c;而Trace相关的部分不是很全面&#xff0c;所以写下这篇博文&#xff0c;以做备忘和分享。 组件介绍 我这里选…

Excel的操作

Excel的操作 一、Excel的作用 Excel是一款功能强大的电子表格软件&#xff0c;主要用于数据处理和分析。 二、Excel的基础操作 新建文档 一般情况下&#xff0c;就在桌面空白处&#xff0c;点击鼠标右键&#xff0c;即可新建 三、页面布局 1、快速访问工具栏 主要包含&am…

为 android编译 luajit库、 交叉编译

时间&#xff1a;20200719 本机环境&#xff1a;iMac2017 macOS11.4 参考: 官方的文档&#xff1a;Use the NDK with other build systems 写在前边&#xff1a;交叉编译跟普通编译类似&#xff0c;无非是利用特殊的编译器、链接器生成动态或静态库; make 本质上是按照 Make…

ssm 学习 ---(spring)

一、spring框架 1、基本框架 2、Beanfactory快速入门 配置清单&#xff1a;xml文件 (1) 导入jar包或者maven坐标 (2) 定义UserService接口以及UserService实现类 (3) 创建bean.xml配置文件&#xff0c;将UserService信息配置到该xml文件中; (4)编写测试代码&#xff0c;创…

ubuntu lxqt触摸屏旋转校准(usb触摸屏、lxqt、ubuntu23.10)

参考文章&#xff1a;https://www.codetd.com/article/5651388 1.查看触摸屏驱动 rootxyy:~# xinput list ⎡ Virtual core pointer id2 [master pointer (3)] ⎜ ↳ Virtual core XTEST pointer id4 [slave pointer (2)…

如何根据同一行的ID利用R语言对值进行求和

需求&#xff1a;将属于同一分组的对应的值进行求和或者求平均值 #设置工作目录 > getwd() [1] "C:/Users/86150/Documents" > setwd("C:/Users/86150/Desktop/AA2024/RUF") > list.files() #读取文件 >install.packages("readxl")…

基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS

基于NeRF的路面重建算法——RoME / EMIE-MAP / RoGS 1. RoMe1.1 Mesh Initialization / Waypoint Sampling1.2 Optimization1.3 Experiments 2. EMIE-MAP2.1 Road Surface Representation based on Explicit mesh and Implicit Encoding2.2 Optimizing Strategies2.3 Experimen…

在 CI/CD Pipeline 中实施持续测试的最佳实践!

随着软件开发周期的不断加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;已经成为现代软件开发的重要组成部分。在这一过程中&#xff0c;持续测试的实施对于确保代码质量、提高发布效率至关重要。本文将详细介绍在CI/CD流水线中…

JVM:JavaAgent技术

文章目录 一、Java工具的介绍二、Java Agent技术1、介绍2、静态加载模式3、动态加载模式 三、搭建java agent静态加载模式环境1、创建maven项目2、编写类和premain方法3、编写MANIFEST.MF文件4、使用maven-assembly-plugin进行打包5、创建Spring Boot应用 一、Java工具的介绍 …

mac数据恢复软件哪个好用 macbook数据恢复专业软件下载 mac数据恢复概率大吗 苹果电脑数据恢复软件哪个好

作为办公的必需品&#xff0c;mac的普及率虽然比不上其他品牌的windows操作系统&#xff0c;但是使用人群也一致居高不下&#xff0c;因此&#xff0c;mac数据丢失的问题也时常发生。当数据丢失以后&#xff0c;如何找回数据成了一大难题。 一、Mac数据恢复概率大吗 一般情况下…

配置mysql8.0.21版本docker-compose启动容器

1. 总览 2 docker-compose.xml配置 version: 3 services:mysql:image: 192.168.188.131:8000/mysqlrestart: alwaysvolumes:- ./data:/var/lib/mysql- ./my.cnf:/etc/mysql/my.cnf- ./mysql-files:/var/lib/mysql-files- ./log/mysql:/var/log/mysqlenvironment:MYSQL_ROOT_PA…