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.rhkb.cn/news/380516.html

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

相关文章

1个Xpath定位可以在Web页面查找到多个元素Selenium

1个Xpath定位可以在Web页面查找到多个元素Selenium//input[id\"transactionId\"] 打开Web页面&#xff0c; 点击F12可以看到压面 点击Ctrl F 可以点图如下图的输入框&#xff0c;输入xpath&#xff0c;看右侧可以找到3个对应的元素 点击Ctrl F 点击Ctrl F 点…

uniapp开发钉钉小程序流程

下载开发工具 1、小程序开发工具 登录钉钉开发平台&#xff0c;根据自己的需求下载合适的版本&#xff0c;我这里下载的是Windows &#xff08;64位&#xff09;版本 小程序开发工具 - 钉钉开放平台 2、HBuilder X HBuilderX-高效极客技巧 新建项目及相关配置 新建项目 …

最新!CSSCI(2023-2024)期刊目录公布!

【SciencePub学术】据鲁迅美术学院7月16日消息&#xff0c;近日&#xff0c;南京大学中国社会科学研究评价中心公布了中文社会科学引文索引&#xff08;CSSCI&#xff09;&#xff08;2023—2024&#xff09;数据库最新入选目录。 C刊一般指CSSCI来源期刊&#xff0c;即南大核心…

通过splunk web服务将服务器上文件下载到本地

1. 需求说明 工作中经常遇到需要将服务器上的文件下载到本地&#xff0c;但是由于各种网络环境限制&#xff0c;没办法使用winscp或者xftp工具&#xff0c;那么如何将服务器上的文件下载下来呢&#xff1f; 这里提供一种思路: 如果服务器上安装有web服务&#xff0c;可将待下…

大语言模型-检索测评指标

1. MRR &#xff08;Mean Reciprocal Rank&#xff09;平均倒数排名&#xff1a; 衡量检索结果排序质量的指标。 计算方式&#xff1a; 对于每个查询&#xff0c;计算被正确检索的文档的最高排名的倒数的平均值&#xff0c;再对所有查询的平均值取均值。 意义&#xff1a; 衡量…

Elastic 线下 Meetup 将于 2024 年 7 月 27 号在深圳举办

2024 Elastic Meetup 深圳站活动&#xff0c;由 Elastic、腾讯、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 时间地点 2024年 7 月 27 日 13:30-18:00 活动地点 中国深圳 南山区海天二路 33 号腾讯滨海大厦 北塔 3 楼多功能厅 ​ 活动流程 14:00-15…

【你也能从零基础学会网站开发】 SQL Server 2000数据库的创建、移除、备份还原操作以及索引、视图、存储过程、触发器基本介绍!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;程序猿、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 认识数据库中都…

GD32F303想控制PA13~15、PB3和PB4不成功?

有没有小伙伴遇到这种情况&#xff1a;在使用GD32F303的时候&#xff0c;想要将PA13~15以及PB3和PB4作为IO口来使用&#xff0c;却怎么也不成功呢&#xff1f;下面小编就来告诉大家原因。 我们先来看下GD32F303 datasheet中这几个引脚的定义&#xff1a; 原来&#xff0c;这几…

钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器

BL20X系列耦合器是钡铼技术开发的一款用于分布式I/O系统的设备&#xff0c;专为工业环境下的高速数据传输和远程设备控制而设计&#xff0c;支持多种工业以太网协议&#xff0c;包括Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP和OPC UA等。如果您正在考虑部署BL20X系列耦合…

AWS服务器购买:如何选择合适的AWS云服务器

在当今数字化时代,云计算已成为企业IT基础设施的重要组成部分。作为全球领先的云服务提供商之一,亚马逊网络服务(AWS)提供了丰富多样的云服务器选项。然而,面对众多选择,如何为您的业务需求挑选最合适的AWS云服务器呢?我们结合九河云的分析来给你解答。 1. 明确业务需求 首先…

excel系列(三) - 利用 easyexcel 快速实现 excel 文件导入导出

一、介绍 在上篇文章中&#xff0c;我们介绍了 easypoi 工具实现 excel 文件的导入导出。 本篇我们继续深入介绍另一款更优秀的 excel 工具库&#xff1a;easyexcel 。 二、easyexcel easyexcel 是阿里巴巴开源的一款 excel 解析工具&#xff0c;底层逻辑也是基于 apache p…

阿里云盾占用资源的问题AliYunDun,AliYunDunUpdate

目录 1.关闭AliYunDunUpdate&#xff0c;AliYunDun&#xff0c;AliYunDunMonitor。 2.发现报错如下 3.打开阿里云安全中心控制台 4.成功解决 2.开启云盾命令 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您…

深度学习落地实战:大模型生成图片

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

Django F()函数

F()函数的作用 F()函数在Django中是一个非常强大的工具&#xff0c;主要用于在查询表达式中引用模型的字段。它允许你在数据库层面执行各种操作&#xff0c;而无需将数据加载到Python内存中。这不仅提高了性能&#xff0c;还允许你利用数据库的优化功能。 字段引用 在查询表达…

【学习css3】使用flex和grid实现等高元素布局

过往的实现方法是使用浮动加计算布局来实现&#xff0c;当flex和grid问世时&#xff0c;这一切将变得简单起来 一、简单的两列实现 1、先看页面效果 2、css代码 .container {padding: 10px;width: 100ch;margin: 0 auto;box-shadow: inset 0 0 0 2px #ccc;}.column {margin: 2…

WordPress外贸建站案例

Vicuna维楚纳wordpress外贸主题 Vicuna维楚纳wordpress外贸主题&#xff0c;适合跨境电商产品展示的wordpress外贸建站模板。 https://www.jianzhanpress.com/?p7132 Der德尔wordpress建站主题 经典中国红红色wordpress主题&#xff0c;适合跨境电商产业园企业建站的wordpr…

C#定时发送邮件功能

C#定时发送邮件功能 背景 自动运维监控客户端在自动关闭时&#xff0c;需要给实施同学发送提醒邮件。支持163邮箱、qq邮箱、火狐邮箱等各种通用邮箱。 定时器发送邮件 代码 邮件功能模块 using ITSLog.LogManage; using System; using System.Collections.Generic; using…

LabVIEW设备检修信息管理系统

开发了基于LabVIEW设计平台开发的设备检修信息管理系统。该系统应用于各种设备的检修基地&#xff0c;通过与基地管理信息系统的连接和数据交换&#xff0c;实现了本地检修工位数据的远程自动化管理&#xff0c;提高了设备的检修效率和安全性。 项目背景 现代设备运维过程中信…

2024.7.19 作业

1.链表的排序 int list_sort(NodePtr L) {if(NULLL || L->len<1){printf("排序失败");return -1;}int lenL->len1;NodePtr p;int i,j;for( i1;i<len;i){for( j0,pL;j<len-i;j,pp->next){if( p->data > p->next->data ){datatype tp-&…

支出这么多?收入从何而来

大家应该体验过租房小程序、开源字节快速开发平台、开源字节网站、开源字节公众号&#xff0c;开源字节小程序等等这些应用&#xff0c;部署这些软件就需要云服务器与域名&#xff0c;这就涉及到成本问题&#xff0c;这不最近续费了服务器费用与域名费用&#xff0c;又是一比不…