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

news2024/11/25 10:53:50

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); //查找是否存在5

    if (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); //查找是否存在5

    if (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.coloradmin.cn/o/48620.html

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

相关文章

使用记账软件记录生活收支明细,如何防止收支不被他人修改

坚持记账是每个人都必须要做的事情&#xff0c;日常生活中的生活开支都是一笔笔的支出&#xff0c;一个月挣来的工资&#xff0c;在不知不觉之中就花完了&#xff0c;可以使用——晨曦记账本记录生活明细&#xff0c;为了防止被他人修改&#xff0c;该如何操作呢&#xff1f;一…

Allegro调丝印规范操作指导

Allegro调丝印规范操作指导 Allegro和其它PCB设计软件一样,丝印的排布也是类似的,具体规范介绍如下 以下图为例 打开Setup-Design Parameter 选择text 设置丝印字体的参数 设置需要丝印的字体,比如3号字体,参数如下 然后点击OK Edit-Change需要调整丝印的字体

Linux-Hadoop部署

部署Hadoop一、Hadoop部署模式1、独立模式2、伪分布式模式3、完全分布式模式二、Hadoop集群规划1、集群拓扑2、角色分配三、JDK安装与配置1、下载JDK压缩包2、上传到master虚拟机3、在master虚拟机上安装配置JDK4、将JDK分发到slave1和slave2虚拟机5、将环境配置文件分发到slav…

图的初识·存储结构

邻接矩阵存储结构 用矩阵表示表示图中各个顶点之间的邻接关系和权值。如图G(V,E)G(V,E)G(V,E)&#xff0c;其中有N个结点&#xff0c;使用NxNNxNNxN的矩阵表示。 不带权值的图 Gij{1,无向图(vi,vj)或有向图的<vi,vj>是图中的边0,无向图的(vi,vj)或有向图的<vi,vj>…

猕猴桃的红色果肉受到特定的激活-抑制系统的控制

文章信息 题目&#xff1a;The red flesh of kiwifruit is differentially controlled by specific activation–repression systems 刊名&#xff1a;New Phytologist 作者&#xff1a;Wen-qiu Wang&#xff0c;Andrew C. Allan,Xue-ren Yin et al 单位&#xff1a;Zhejia…

猿如意开发工具|Sublime Text(4126)

文章目录 一、猿如意是什么&#xff1f; 二、如何使用猿如意下载安装Sublime Text 三、总结 一、猿如意是什么&#xff1f; 猿如意是一款面向开发者的辅助开发工具箱&#xff0c;包含了效率工具、开发工具下载&#xff0c;教程文档&#xff0c;代码片段搜索&#xff0c;全网搜…

【Pandas数据处理100例】(九十九):Pandas使用at_time()筛选出特定时间点的数据行

前言 大家好,我是阿光。 本专栏整理了《Pandas数据分析处理》,内包含了各种常见的数据处理,以及Pandas内置函数的使用方法,帮助我们快速便捷的处理表格数据。 正在更新中~ ✨ 🚨 我的项目环境: 平台:Windows10语言环境:python3.7编译器:PyCharmPandas版本:1.3.5N…

如何建立一套完善的销售管理体系?

怎样创建两套健全的产品销售体系&#xff1f;用工程建设观念管理工作产品销售项目组&#xff0c;创建健全的产品销售体系&#xff01; 逐步形成精确的最终目标虽说重要&#xff0c;但缺乏有效率的方式来破冰&#xff0c;最终目标可能将仅是这份无用。 篮球赛事球手的最终目标…

IOC 的底层原理和Bean管理XML方式、xml注入集合属性

目录 什么是IOC IOC底层管理 工厂模式 IOC 的过程 IOC 接口 IOC 操作Bean 原理 Bean 管理操作有两种方式 1. 基于xml 配置方式创建对象 2. 基于xml方式注入属性 第二种使用有参数构造注入 p 名称空间注入 ICO操作Bean管理&#xff08;xml 注入其他类型属性&#xff…

微信小程序的 websocket 以及 微信开发者工具测试 ws 协议没有数据的 离奇解决方案 记录

微信小程序的 websocket 在本地web能够使用ws协议去链接websocket&#xff0c;但是小程序不能使用。一、WSS 协议与 WS 协议二、业务场景记录 : 使用 ws 协议的 websocekt 做测试,但是在 h5中可以拿到实时数据,在微信开发者工具中以及真机调试中拿不到模拟数据的问题1. 首先在 …

2022安洵杯babybf

babybf 赛后分析了下&#xff0c;发现是一道很有意思的题目 Brainfuck是一种极小化的计算机语言&#xff0c;它是由Urban Mller在1993年创建的。由于fuck在英语中是脏话&#xff0c;这种语言有时被称为brainf*ck或brainf**k&#xff0c;甚至被简称为BF。 其实本题是一个c语言实…

三、【redux】异步action

文章目录1、不成熟的异步修改1.1、CODE1.1.1、count_action.js1.1.1、count_reducer.js1.2、异常2、异步action代码修正2.1、store.js2.2、count_action.js3、小总结action分两类&#xff1a; 同步&#xff1a;指action的值是Object类型的一般对象异步&#xff1a;指action的值…

在C#中使用Halcon开发视觉检测程序

本文的初衷是希望帮助那些有其它平台视觉算法开发经验的人能快速转入Halcon平台下&#xff0c;通过文中的示例开发者能快速了解一个Halcon项目开发的基本步骤&#xff0c;让开发者能把精力完全集中到算法的开发上面。 首先&#xff0c;你需要安装Halcon&#xff0c;HALCON 18.…

D. X-Magic Pair(辗转相除)

Problem - 1612D - Codeforces 给你一对整数&#xff08;a,b&#xff09;和一个整数x。 你可以用两种不同的方式改变这对整数。 设置&#xff08;分配&#xff09;a:|a-b|。 设置&#xff08;分配&#xff09;b:|a-b|。 其中|a-b|是a和b之间的绝对差值。 如果只用给定的操作就…

【Linux】shell命令行简单解释器

回顾一下&#xff0c;我们前面学习了进程创建&#xff0c;进程终止&#xff0c;进程等待&#xff0c;进程替换&#xff0c;通过这些内容我们可以来进行实现简单的shell命令行解释器&#xff01;&#xff01;&#xff01;下面我们直接来看一看如何去实现shell命令行解释器&#…

结合编辑器和PDFXplorer工具查看PDF文件结构

首先用编辑器打开PDF,可以看到如下结构 1.寻找文件结构入口 /Root k-value形式&#xff0c;/Root 98 0 R/ k是Root value是98 0 R 98 0 R 代表被引用&#xff0c;指向的对象是98 0 obj 用PDFExploer工具打开看&#xff0c;如下&#xff1a; 可以看出用工具打开的树形结构跟上…

[附源码]计算机毕业设计springboot快转二手品牌包在线交易系统

项目运行 环境配置&#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…

YonBuilder开发之后端函数

在前几期的文章中我们已经介绍过如何在YonBuilder中使用前端函数实现数据过滤功能。相对应于前端函数&#xff0c;在YonBuilder中还可以使用后端函数实现对于程序的扩展。通过前端函数实现的更多的是与页面交互相关的功能&#xff0c;而后端函数主要是用于预制按钮功能的扩展开…

Mybatis的介绍及使用

目录 Mybatis 搭建MyBatis开发环境 1、创建Maven工程&#xff0c;导入MyBatis依赖的组件 2、编写MyBatis核心配置文件(mybatis-config.xml) 3、创建实体类-POJO 4、创建SQL映射文件(mapper.xml) 5、创建测试类 Mybatis MyBatis是一款优秀的持久层框架&#xff0c;用于简…

时光邮局|来写一封未来的信试试吧!一个我的新项目,Java+Vue

什么是时光邮局&#xff1f; 漫漫星河璀璨&#xff0c;漫漫古道长河。 官网&#xff1a;云寄-时光邮局 寻找一份特殊的意义&#xff0c;学会热爱生活&#xff0c;学会面朝大海。 有一天我收到了两年前的自己来信。 如果可以给末来寄信你会写些什么呢&#xff1f; 如果能收到两…