STL的常用算法-查找 (20221130)

news/2024/4/27 20:58:35/文章来源:https://blog.csdn.net/qq_60143666/article/details/128113501

STL的常用算法

概述:

算法主要是由头文件<algorithm> <functional> <numeric> 组成。

<algorithm>是所有STL头文件中最大的一个,涉及比较、交换、查找、遍历等等;

<functional>定义了一些模板类,用于声明函数对象;

<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。

二、查找算法

find

find_if //按条件查找元素

adjacent_find //查找相邻重复元素

binary_search //二分查找法

count //统计元素个数

count_if  //按条件统计元素个数

1、find

find(iterator beg,iterator end,value);

//按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器

beg:开始迭代器

end:结束迭代器

value :查找的元素

查找自定义数据类型时报错:

error C2678: 二进制“==”: 没有找到接受“Person”类型的左操作数的运算符(或没有可接受的转换)

对自定义数据类型进行查找时,需要重载==,使底层知道如何对比

#include<iostream>using namespace std;#include<vector>#include<algorithm>#include<string>class Person {public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}//对自定义数据类型进行查找时,需要重载==,使底层知道如何对比bool operator==(const Person&p) //避免修改 加const{if (p.m_name == this->m_name&&p.m_age == this->m_age){return true;}return false;}};void test01(){//find//查找内置数据类型vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);vector<int>::iterator pos = find(V1.begin(), V1.end(), 5); //查找是否存在5if (pos != V1.end()){cout << "存在元素" << *pos << endl;}else{cout << "未找到元素" << endl;//输出未找到元素}//查找自定义数据类型vector<Person>P;//创建对象Person p1("张三", 10);Person p2("张位", 20);Person p3("张益达", 30);Person p4("张国伟", 50);P.push_back(p1);P.push_back(p2);P.push_back(p3);P.push_back(p4);vector<Person>::iterator it = find(P.begin(), P.end(), p2); //查找是否存在5if (it != P.end()){cout << "找到该人物" << "姓名:"<<it->m_name<< "  年龄:"<<it->m_age<<endl;}else{cout << "未找到该人" << endl;}Person p("zzzz", 90);it = find(P.begin(), P.end(), p);if (it != P.end()){cout << "找到该人物" << "姓名:" << it->m_name << "  年龄:" << it->m_age << endl;}else{cout << "未找到该人" << endl;//输出未找到元素}}

 

2、find_if

find_if(iterator beg,iterator end,_Pred);

//按条件查找元素,找到返回指定位置迭代器,找不到返回结束迭代器

beg:开始迭代器

end:结束迭代器

_Pred:函数或谓词

class Person {public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}//对自定义数据类型进行查找时,需要重载==,使底层知道如何对比bool operator==(const Person&p) //避免修改 加const{if (p.m_name == this->m_name&&p.m_age == this->m_age){return true;}return false;}};class GreaterFive {public:bool operator()(int val){return val > 5;}};class AgeGreater {public:bool operator()(const Person&p){return p.m_age > 20;}};void test02(){//find_if//查找内置数据类型vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);vector<int>::iterator pos = find_if(V1.begin(), V1.end(), GreaterFive()); //查找大于5的数 GreaterFive()匿名函数if (pos != V1.end()){cout << "找到大于5的数" << *pos << endl;//输出第一个大于5的数  10}else{cout << "未找到元素" << endl;//输出未找到元素}//查找自定义数据类型vector<Person>P;//创建对象Person p1("张三", 10);Person p2("张位", 20);Person p3("张益达", 30);Person p4("张国伟", 50);P.push_back(p1);P.push_back(p2);P.push_back(p3);P.push_back(p4);vector<Person>::iterator it = find_if(P.begin(), P.end(), AgeGreater()); //查找是否存在年龄大于20的人if (it != P.end()){cout << "找到该人物" << "姓名:" << it->m_name << "  年龄:" << it->m_age << endl;}else{cout << "未找到该人" << endl;}}

3、adjacent_find(iterator beg,iterator end)

查找相邻重复元素,返回相邻元素的第一个元素的迭代器

void test03(){//adjacent_find//查找内置数据类型vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);V1.push_back(80);vector<int>::iterator pos = adjacent_find(V1.begin(), V1.end()); //查找大于5的数 GreaterFive()匿名函数if (pos != V1.end()){cout << "找到相邻元素" << *pos << endl; //80}else{cout << "未找到相邻元素" << endl;}//查找自定义数据类型vector<Person>P;//创建对象Person p1("张三", 10);Person p2("张位", 20);Person p3("张益达", 30);Person p4("张国伟", 50);Person p5("张国伟", 50);P.push_back(p1);P.push_back(p2);P.push_back(p3);P.push_back(p4);P.push_back(p5);vector<Person>::iterator it = adjacent_find(P.begin(), P.end()); //查找是否存在信息相同的人if (it != P.end()){cout << "找到该人物" << "姓名:" << it->m_name << "  年龄:" << it->m_age << endl;}else{cout << "未找到该人" << endl;}}

 

4、binary_search

查找指定元素是否存在 底层为二分法查询;

bool binary_search(iterator beg,iterator end,value)

value:查找的元素

若指定元素查到则返回true,否则返回false

注意:在无序序列中不可用;若为无序序列,则可能找到,可能找不到,结果不准确。

void test04(){vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);V1.push_back(80);bool flag = binary_search(V1.begin(), V1.end(),10); //此时序列为无序 结果不准确 打印出:未找到相邻元素if (flag==true){cout << "找到相邻元素" << endl;}else{cout << "未找到相邻元素" << endl;}vector<int>V2;for (int i = 0; i < 10; i++){V2.push_back(i);}flag = binary_search(V2.begin(), V2.end(), 9);//为有序序列,可以找到该元素if (flag == true){cout << "找到相邻元素" << endl;}else{cout << "未找到相邻元素" << endl;}}

 

5、count

统计元素个数

函数原型:

count(iterator beg,iterator end,value);

value:统计的元素

class Person {public:string m_name;int m_age;Person(string name, int age){this->m_name = name;this->m_age = age;}//对自定义数据类型进行统计时,需要重载==,使底层知道如何对比bool operator==(const Person&p) //避免修改 加const{if (p.m_age == this->m_age){return true;}return false;}};void test05(){//count//统计内置数据类型vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);V1.push_back(80);int num = count(V1.begin(), V1.end(),80);cout << "80的个数为" << num << endl; //2//统计自定义数据类型vector<Person>P;//创建对象Person p1("张三", 10);Person p2("张伟", 20);Person p3("张益达", 30);Person p4("张国伟", 50);Person p5("张国伟", 50);P.push_back(p1);P.push_back(p2);P.push_back(p3);P.push_back(p4);P.push_back(p5);Person p("张哈哈", 50);//统计与张哈哈年龄相同的人的个数 此时需要重载== ,即重新定义如何判等int PersonNum =count(P.begin(), P.end(),p);cout << "与张哈哈年龄相同人数为"<< PersonNum << endl;}

 

6、count_if

按条件统计元素个数

count(iterator beg,iterator end,_Pred);

与count的区别为将统计value换为谓词

class Greater20 {public:bool operator()(int val){return val > 20;}};class Age20 {public:bool operator()(const Person &p){return p.m_age > 20;}};void test06(){//count_if//统计内置数据类型vector<int>V1;V1.push_back(10);V1.push_back(20);V1.push_back(0);V1.push_back(80);V1.push_back(80);int num = count_if(V1.begin(), V1.end(), Greater20()); // Greater20()为匿名对象cout << "大于20的个数为" << num << endl; //  2//统计自定义数据类型vector<Person>P;//创建对象Person p1("张三", 10);Person p2("张伟", 20);Person p3("张益达", 30);Person p4("张国伟", 50);Person p5("张国伟", 50);P.push_back(p1);P.push_back(p2);P.push_back(p3);P.push_back(p4);P.push_back(p5);//统计年龄大于20的人数int PersonNum = count_if(P.begin(), P.end(), Age20());cout << "年龄大于20的人数为" << PersonNum << endl; //3}

 

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

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

相关文章

如何设计可扩展架构

架构设计复杂度模型 业务复杂度和质量复杂度是正交的 业务复杂度 业务固有的复杂度&#xff0c;主要体现为难以理解、难以扩展&#xff0c;例如服务数量多、业务流程长、业务之间关系复杂 质量复杂度 高性能、高可用、成本、安全等质量属性的要求 架构复杂度应对之道 复杂…

野火FPGA进阶(2):基于I2C协议的EEPROM驱动控制

文章目录第49讲&#xff1a;基于I2C协议的EEPROM驱动控制理论部分设计与实现i2c_ctrli2c_rw_dataeeprom_byte_rd_wrtb_eeprom_byte_rd_wr第49讲&#xff1a;基于I2C协议的EEPROM驱动控制 理论部分 I2C通讯协议&#xff08;Inter-Integrated Circuit&#xff09;是由Philips公…

改革后IB数学该如何选?

IB数学&#xff0c;作为一个IB课程里必选科目&#xff0c;让无数IB学霸为之自豪&#xff0c;他们能解出外教都不会做的题。另一方面&#xff0c;也让很多同学&#xff08;自称“学渣”&#xff09;避之不及。 从2019年起&#xff0c;IB数学教学大纲发生重大改革。▲图源&#x…

C语言详细知识点(下)

⛄️上一篇⛄️C语言详细知识点&#xff08;上&#xff09; 文章目录五、数组1、一维数组的定义及使用2、二维数组的定义及使用3、字符数组的定义及使用六、函数1、函数的定义2、函数的调用3、函数的声明4、函数的嵌套调用5、函数的递归调用七、指针1、什么是指针2、指针变量3、…

链表之反转链表

文章目录链表之反转链表题目描述解题思路代码实现链表之反转链表 力扣链接 题目描述 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 示例&#xff1a; ​ 输入: 1->2->3->4->5->NULL ​ 输出: 5->4-&…

基于vue项目的代码优化

前言 项目上线后其整体性能的优良是用户也是研发人员所关注的。项目优化非常重要&#xff0c;一丝一毫的提升都是对用户的负责。因此我们在开发中就应该注重细节&#xff0c;优化工作从日常开发做起。本篇文章就分享一些在日常开发中代码层面的优化手段。 开发常用优化手段 …

达摩院快速动作识别TPS ECCV论文深入解读

一、论文&代码 论文&#xff1a;https://www.ecva.net/papers/eccv_2022/papers_ECCV/papers/136630615.pdf 模型&代码&#xff1a;ModelScope 魔搭社区 二、背景 高效的时空建模(Spatiotemporal modeling)是视频理解和动作识别的核心问题。相较于图像的Transforme…

开源共建 | TIS整合数据同步工具ChunJun,携手完善开源生态

TIS整合ChunJun实操 B站视频&#xff1a; https://www.bilibili.com/video/BV1QM411z7w5/?spm_id_from333.999.0.0 一、ChunJun 概述 ChunJun是一款易用、稳定、高效的批流统一的数据集成框架&#xff0c;可基于实时计算引擎Flink实现多种异构数据源之间的数据同步与计算&…

flink学习

Flink学习之路&#xff08;一&#xff09;Flink简介 - 走看看 Flink(一)-基本概念 - 知乎 Flink架构&#xff1a; Flink整个系统包含三个部分&#xff1a; 1、Client&#xff1a; 给用户提供向Flink系统提交用户任务&#xff08;流式作业&#xff09;的能力。用户提交一个F…

全球无人驾驶大洗牌,百度Apollo Day宣告Robotaxi进入2.0时代

作者 | 德新 编辑 | 王博1. 全球无人驾驶大洗牌&#xff0c;Robotaxi越发向头部聚集 全球无人驾驶落地正呈现两幅面孔。随着资本热潮褪去&#xff0c;一部分公司在资金和研发上已经难以为继&#xff0c;Robotaxi落地的资源和希望&#xff0c;正无限向头部公司聚集。 10月&#…

OVS DPDK VXLAN隧道处理

在学习OVS VXLAN实现之前&#xff0c;我们先回顾一下传统VTEP设备是如何处理VXLAN报文的。如下图所示&#xff1a; vxlan报文进入交换机端口后&#xff0c;根据报文头部信息进行vxlan隧道终结。隧道终结后&#xff0c;根据underlay信息进行overlay映射&#xff0c;得到overlay的…

鲲鹏devkit性能分析工具介绍(四)

鲲鹏devkit性能分析工具介绍&#xff08;四&#xff09; 前面我们已经介绍了鲲鹏devkit性能分析工具的全景分析、热点函数分析、进程/线程分析、微架构分析、和访存分析&#xff0c;由此可见进行性能调优绝对不能够仅仅去进行一方面的考察而是需要全方面的数据分析进行一定的舍…

8、多进程之间的通信

多进程之间的常用通信方法有两种&#xff0c;及Queue和Pipe 一、Queue Queue([maxsize])&#xff1a;创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数&#xff0c;则无大小限制。底层队列使用管道和锁定实现。另外&#xff0c;还需要运行支持线程以便队列中…

[附源码]计算机毕业设计springboot基于Web的软考题库平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[论文阅读] Curriculum Semi-supervised Segmentation

[论文地址] [代码] [MICCAI 19] Abstract 本研究调查了半监督CNN分割的课程式策略&#xff0c;它设计了一个回归网络来学习图像级信息&#xff0c;如目标区域的大小。这些回归被用来有效地规范分割网络&#xff0c;约束未标记图像的softmax预测&#xff0c;使其与推断的标签分…

16-JavaSE基础巩固项目:拼图小游戏

阶段项目-拼图小游戏 一、项目介绍 1、目的 锻炼逻辑思维能力&#xff0c;让我们知道前面学习的知识点在实际开发中的应用场景。 1、为了学习一个新知识&#xff1a;GUI GUI全称&#xff1a;Graphical User Interface&#xff08;又称图形用户接口&#xff09;是指采用图形化…

【Android进阶之旅】内存泄漏的危害有哪些?(案例分析)

随着计算机应用需求的日益增加&#xff0c;应用程序的设计与开发也相应的日趋复杂&#xff1b; 开发人员在程序实现的过程中处理的变量也大量增加&#xff0c;如何有效进行内存分配和释放&#xff0c;防止内存泄漏的问题变得越来越突出 例如&#xff1a; 服务器应用软件&#x…

Redis 内存淘汰和过期删除策略

提起使用Redis的优点&#xff0c;大家可以列举出许多&#xff0c;比如&#xff1a;数据存储在内存&#xff0c;读写速度快&#xff0c;性能优异。比如数据持久化&#xff0c;便于数据备份及恢复等等。 分布式服务系统平台发展至今&#xff0c;Redis活跃在平台的各个领域&#…

RabbitMQ事务消息

通过对信道的设置实现 channel.txSelect()&#xff1b;通知服务器开启事务模式&#xff1b;服务端会返回Tx.Select-Ok channel.basicPublish&#xff1b;发送消息&#xff0c;可以是多条&#xff0c;可以是消费消息提交ackchannel.txCommit() &#xff1b;提交事务&#xff1b;…

mmdetection3d SUN RGB-D数据集预处理

SUN RGB-D是普林斯顿大学发布的一种关于室内场景理解的数据集&#xff0c;共包含了10335个样本&#xff0c;其中训练样本和验证测试样本数量分别为5285和5050。每个样本包含了彩色图像&#xff08;RGB&#xff09;和深度&#xff08;D&#xff09;信息&#xff0c;并且分别进行…