STL常用算法——查找算法

2023-05-16

文章目录

  • STL常用算法——查找算法
    • 1、find()
    • 2、find_if()
    • 3、adjacent_find()
    • 4、binary_search()
    • 5、count()和count_if()
      • 5.1、count()
      • 5.2、count_if()

STL常用算法——查找算法

1、find()

find() 函数是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。

函数原型:

find(iterator beg,iterator end,value);

参数说明:

  • beg和 end:开始和结束迭代器
  • [beg, end):指定该函数的查找范围
  • value:查找的目标元素

find() 函数会返回一个输入迭代器,当 find() 函数查找到目标元素时,其指向查找到的第一个目标元素位置迭代器;如果查找失败,则该迭代器的指向和 end相同。

find()函数的底层实现就是用==运算符将目标值和查找范围内的元素逐个进行比对。

查找内置数据类型

void test01() {
	vector<int> v;
	for (int i = 0;i < 10;i++) {
		v.push_back(i);
	}
	//查找容器中是否有3这个元素
	vector<int>::iterator it = find(v.begin(), v.end(), 3);
	if (it != v.end()) {
		cout << "容器中有3这个元素" << endl;
	}
	else {
		cout << "容器中没有3这个元素" << endl;
	}
}

查找自定义数据类型

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>

class Person {
public:
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	//重载==运算符,find()函数的底层实现就是用==运算符将目标值和查找范围内的元素逐个进行比对
	bool operator ==(const Person &p) {
		if ((this->name == p.name) && (this->age == p.age)){
			return true;
		}
		else{
			return false;
		}
	}
	string name;
	int age;
};
void test02() {
	vector<Person> v1;
	Person p1("张三", 13);
	Person p2("李四", 14);
	Person p3("王五", 15);
	Person p4("赵六", 16);
	v1.push_back(p1);
	v1.push_back(p2);
	v1.push_back(p3);
	v1.push_back(p4);

	vector<Person>::iterator it = find(v1.begin(), v1.end(), p2);
	if (it == v1.end()) {
		cout << "容器中没有p2这个元素" << endl;
	}
	else {
		cout << "姓名:"<<it->name<<"年龄:"<<it->age << endl;
	}
}
int main() {
	test02();
	system("pause");
	return 0;
}

在这里插入图片描述

2、find_if()

find_if() 函数用于在指定区域内执行查找操作。

和find() 函数不同的是,find() 函数需要明确指定要查找的元素的值,而find_if() 允许自定义条件来查找元素。

函数原型:

find_if(iterator beg,iterator end,_Pred);

参数说明:

  • beg 开始迭代器

  • end 结束迭代器

  • _Pred 函数或一元谓词函数(有一个形参且返回值类型为 bool 的仿函数)

当 find_if() 函数查找到目标元素时,其指向查找到的第一个目标元素位置迭代器;如果查找失败,则该迭代器的指向和 end相同。

查找内置数据类型

//自定义查找规则
class GreaterFive {
public:
	bool operator()(int val) {
		return val > 5;
	}
};
void test01() {
	vector<int> v;
	v.push_back(1);
	v.push_back(3);
	v.push_back(5);
	v.push_back(7);
	v.push_back(9);
	vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
	if (it != v.end()) {
		cout << "找到了大于5的数字" << endl;
		cout << "在这个容器中第一个大于5的数字是" << *it << endl;
	}
}

自定义查找元素规则

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

class Person{
public:
	Person(string name, int age) {
		this->name = name;
		this->age = age;
	}
	string name;
	int age;
};
//自定义查找元素规则函数对象
class Greater20 {
public:
	bool operator()(const Person& p) {
		return p.age > 20;
	}
};

void test01() {
	vector<Person> v;
	Person p1("张三", 13);
	Person p2("李四", 14);
	Person p3("王五", 23);
	Person p4("赵六", 24);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	v.push_back(p4);
	//找年龄大于20的
	vector<Person>::iterator it = find_if(v.begin(), v.end(), Greater20());
	if (it != v.end()) {
		cout << "在容器v中找到年龄大于20的人" << endl;
		cout << "第一个的姓名为" << (*it).name << " 年龄为 " << (*it).age << endl;
	}
	else {
		cout << "没有找到年龄大于20的" << endl;
	}
}

int main() {
	test01();
	system("pause");
	return 0;
}

在这里插入图片描述

find_if_not()

find_if_not() 函数和 find_if() 函数的功能恰好相反,用于查找第一个不符合查找规则的目标元素。

find_if_not()函数的返回和 find_if() 函数相同。

// 一元谓词函数作为查找规则
bool mycomp(int i) {
	return ((i % 2) == 1);
}
void test01() {

	vector<int> v{ 4,2,3,1,5 };
    //查找不符合 (i%2)==1的元素,并返回一个指向该元素的迭代器
	vector<int>::iterator it = find_if_not(v.begin(), v.end(), mycomp);
	cout << "*it = " << *it << endl; //*it = 4
}

3、adjacent_find()

adjacent_find() 函数用于在指定范围内查找 2 个连续相等的元素。

函数原型:该函数有以下两种语法格式

//查找 2 个连续相等的元素
adjacent_find(iterator beg,iterator end);
//查找 2 个连续满足 pred 规则的元素
adjacent_find(iterator beg,iterator end,BinaryPredicate pred);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
  • pred:接收一个包含 2 个参数且返回值类型为 bool 的函数,以实现自定义查找规则。

adjacent_find()函数会返回一个迭代器,当查找成功时,该迭代器指向的是连续相等元素的第 1 个元素;而如果查找失败,该迭代器的指向和 end 迭代器相同。

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

//以函数对象的形式定义一个查找规则
class mycomp {
public:
	bool operator()(const int& _Left, const int& _Right) {
		return (_Left == _Right);
	}
};

void test01() {
	vector<int> v{3,2,1,5,5,6,7,7};

	//查找 2 个连续相等的元素
	vector<int>::iterator it = adjacent_find(v.begin(), v.end());
	if (it != v.end()) {
		cout << "找到了重复相邻元素" << endl;
		cout << "最早的相邻元素为" << *it << endl;
	}
	else {
		cout << "没有重复的相邻元素" << endl;
	}
	//查找 2 个连续满足 pred 规则的元素
	it = adjacent_find(++it, v.end(), mycomp());
	if (it != v.end()) {
		cout << "相邻元素为 " << *it;
        cout << endl;
	}
}
int main() {
	test01();
	system("pause");
	return 0;
}

在这里插入图片描述

4、binary_search()

binary_search() 函数用于查找指定范围内是否包含某个目标元素。

函数原型:该函数有以下两种语法格式

//查找 [beg, end) 区域内是否包含 value
bool binary_search (iterator beg,iterator end,value);
//根据 comp 指定的规则,查找 [beg, end) 区域内是否包含 value
bool binary_search (iterator beg,iterator end,value, Compare comp);

参数说明:

  • beg 开始迭代器

  • end 结束迭代器

  • value 查找的元素

  • comp 用于自定义查找规则的普通函数或函数对象。此函数接收一个包含 2 个形参且返回值为 bool 类型

如果 binary_search() 函数在 [beg, end) 区域内找到目标元素,则返回 true;反之返回 false。

binary_search() 底层实现采用的是二分查找的方式,在无序序列中查找是时好时坏,结果不稳定。因此该函数仅适用于“已排好序”的序列,在无序序列中不可用。

#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

//以函数对象的形式定义查找规则
class mycomp {
public:
	bool operator()(const int& i, const int& j) {
		return i > j;
	}
};

void test01() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	//从 v 容器查找元素 9
	bool res = binary_search(v.begin(), v.end(), 9);
	cout << "res:" << res << endl; //res:1
	vector<int> v1{ 6,5,3,1,7 };
	//从 v1 容器查找元素 3
	bool res1 = binary_search(v1.begin(), v1.end(), 3, mycomp());
	cout << "res1:" << res1 << endl; //res1:1
}
int main() {
	test01();
	system("pause");
	return 0;
}

5、count()和count_if()

5.1、count()

count()函数:统计区域内目标元素的个数

函数原型:

count(iterator beg,iterator end,value);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
  • value 统计的目标元素
#include<iostream>
using namespace std;
#include<algorithm>
#include<vector>

//1.统计内置数据类型个数
void test01() {
	vector<int> v{2,4,6,7,4,2,4};
	int num = count(v.begin(), v.end(), 2);
	int num1 = count(v.begin(), v.end(), 4);
	cout << "容器中2的个数为:" << num << endl;
	cout << "容器中4的个数为:" << num1 << endl;
}

//2.统计自定义数据类型个数
class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}
	//重载==操作符,判断自定义类型是否相同
	bool operator==(const Person& p) {
		if ((this->m_Name == p.m_Name) && (this->m_Age == p.m_Age)) {
			return true;
		}
		else {
			return false;
		}
	}
	string m_Name;
	int m_Age;
};
void test02() {
	Person p1("a", 13);
	Person p2("b", 23);
	Person p3("s", 23);
	Person p4("c", 23);
	Person p5("h", 23);
	Person p6("a", 13);
	Person p7("a", 13);
	vector<Person> v{p1,p2,p3,p4,p5,p6,p7};
	Person p("a", 13);
	int num = count(v.begin(), v.end(), p);
	cout << "姓名为a年龄为13的有" << num << "个" << endl;
}
int main() {
	test01();
	test02();
	system("pause");
	return 0;
}

5.2、count_if()

count_if():按自定义规则统计范围内目标元素的个数

函数原型:

count_if(iterator beg,iterator end,_Pred);

参数说明:

  • beg 开始迭代器
  • end 结束迭代器
  • _Pred 函数或一元谓词函数
//1.统计内置数据类型
class Greater3 {
public:
	bool operator()(int val) {
		return val > 3;
	}
};
void test01() {
	vector<int> v{2,2,4,6,7,2};
	int num = count_if(v.begin(), v.end(), Greater3());
	cout << "容器中大于3的个数为:" << num << endl; //容器中大于3的个数为:3
}

//2.统计自定义数据类型
class Person {
public:
	Person(string name, int age) {
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};
class MyCompare30 {
public:
	bool operator()(const Person& p) {
		if (p.m_Age > 30) {
			return true;
		}
		else {
			return false;
		}
	}
};
void test02() {
	
	Person p1("a", 13);
	Person p2("b", 23);
	Person p3("s", 33);
	Person p4("c", 43);
	Person p5("h", 53);
	Person p6("a", 13);
	Person p7("a", 63);
	vector<Person> v{p1,p2,p3,p4,p5,p6,p7};
	int num = count_if(v.begin(), v.end(), MyCompare30());
	cout << "年龄大于30的人员个数:" << num << endl; //年龄大于30的人员个数:4
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STL常用算法——查找算法 的相关文章

  • 判断一棵二叉树是否为完全二叉树

    1 完全二叉树的特点 xff08 来自专业定义 xff09 看到上面完全二叉树的特点 xff0c 我可以将其特点按照自己的 理解归纳为以下几点 xff1a xff08 1 xff1a 若二叉树最下面一层有节点出现 xff0c 那么这个节点一
  • 深入理解JNI技术

    一 JNI是什么 xff1f JNI是Java Native Interface的缩写 xff0c 译为Java本地调用 JNI是一种技术 二 JNI技术的用途 xff1f Java程序中的函数调用Native程序中的函数 Native一般
  • HTTP基本认证(Basic Authentication)

    在浏览网页时候 xff0c 浏览器会弹出一个登录验证的对话框 xff0c 如下图 xff0c 这就是使用HTTP基本认证 1 客户端发送http request 给服务器 服务器验证该用户是否已经登录验证过了 xff0c 如果没有的话 xf
  • 将字符串以单词为单位逆序"I am a Student" 解法

    网上有个题目 xff0c 将字符串以单词为单位逆序 例如 34 I am a Student 34 要变成 34 Student a am I 34 解法大致为 xff1a 先将字符串整体逆序第一个字符和最后一个交换 xff0c 第二个与倒
  • 堆排序查找前N个最大数和二分查找算法

    先了解堆排序概念 堆排序利用了大根堆 xff08 或小根堆 xff09 堆顶记录的关键字最大 xff08 或最小 xff09 这一特征 xff0c 使得在当前无序区中选取最大 xff08 或最小 xff09 关键字的记录变得简单 xff08
  • 构建hash表和两种处理冲突方法

    hash表定义 hashing定义了一种将字符组成的字符串转换为固定长度 xff08 一般是更短长度 xff09 的数值或索引值的方法 xff0c 称为散列法 xff0c 也叫哈希法 由于通过更短的哈希值比用原始值进行数据库搜索更快 xff
  • 用hash_map统计出现次数最多的前N个URL

    海量数据统计频率最高词汇的常规办法之一是先通过一个hash函数处理数据然后取模N xff0c 拆分为N个小文件 xff0c 对每一个小文件进行词频统计和排序处理 xff0c 然后归并N个小文件取频率最大的M个数 下面程序是利用hash ma
  • C++与java语法的异同整理

    文章目录 Java与C 43 43 与基础语法异同java的认知 amp java与C 43 43 的异同C 43 43 中的虚函数和JAVA中的抽象方法区别C 43 43 虚函数与JAVA中抽象函数比较关于接口与抽象类 xff1a Jav
  • 微信公众平台-股票行情查询

    微信公众平台 股票行情查询 php实现的获取上证 xff0c 深证 A B股实时行情的接口 xff0c 只实现了文本消息回复 xff0c K线图可以在图文消息中加上接口url地址就可以显示 xff0c 具体的接口地址网上可以找 xff0c
  • PELCO-D与PELCO-P协议介绍

    一般控制协议都由硬件或软件商编制在程序里面 xff0c 我们只需要通过相关的控制设备来进行操作 但是作为一个从事监控行业的技术人员 xff0c 往往会遇到除了电脑和协议转换器以外根本没有任何控制设备的情况 xff0c 此时 xff0c 协议
  • ROS 问题(topic types do not match、topic datatype/md5sum not match、msg xxx have changed. rerun cmake)

    1 topic types 不匹配 使用 roslaunch 命令 roslaunch carla ros bridge carla ros bridge with example ego vehicle launch 启动官方 demo
  • Ubuntu中查看安装的Python版本以及不同版本之间切换

    查看系统中已安装的所有Python版本 使用 ls 命令来查看你的系统中都有那些 Python 的二进制文件可供使用 xiyou 64 span class token property xiyou virtual machine span
  • Ubuntu Python 多版本安装

    概述 由于 Python 3 有几次较为跳跃的更新 xff0c 导致大量使用 Python 3 作为开发工具的软件会对 Python 3 的版本进行严格限制 xff0c 如限制使用 Python 3 8 Python 3 9 版本 这要求开
  • 怒爬某 Hub 资源就为撸了一个鉴黄平台

    来源 xff1a 码匠笔记公号 黄色已经是我们所不容然而却防不胜防的 xff0c 尤其是对于做内容的工具和平台 xff0c 所以花了30分钟搭建了一个鉴黄平台 xff0c 分享给大家 数据准备 找了 N 多资源都不能解决问题 xff0c 于
  • ROSERROR : datatype/md5sum

    出错原因是 xff1a 自定义消息 xff0c 发送话题的消息类型和接受话题的消息类型不一样 但是我的代码真的是一样的 所以 xff0c 解决办法是 xff1a 清空工作空间的build devel文件夹 xff0c 重新编译运行 成功 x
  • 学习使用 ArUco 标记

    在本文中 xff0c 我们将研究使用 Python 和 OpenCV 检测和估计 ArUco 标记的方向 首先 xff0c 我们将从生成 ArUco 标记开始 你可以使用特定网站一个一个地创建单个标签 xff0c 也可以使用我的程序生成整个
  • TCP协议中的序列号

    TCP 协议工作在OSI的传输层 xff0c 是一种可靠的面向连接的数据流协议 xff0c TCP之所以可靠 xff0c 是因为它保证了传送数据包的顺序 顺序是用一个序列号来保证的 响应包内也包括一个序列号 xff0c 表示接收方准备好这个
  • c++开发过程中遇到的问题及解决方案

    xfeff xfeff 问题一 xff1a 1 gt JForm obj error LNK2019 无法解析的外部符号 34 public virtual thiscall JFC JForm JForm void 34 1JForm 6
  • Digest Auth 摘要认证

    Digest Auth 摘要认证 1 非常规方式 转载 xff1a https blog csdn net qq 25391785 article details 86595529 public static void postMethod
  • 嵌入式C语言基础知识--位操作

    目录 大小端模式 xff1a 字节高低位 xff1a LSB和MSB xff1a 高位先行msb 低位先行lsb xff1a 串口传输是低位先行 IIC传输是高位先行 字节序 比特序 大端模式 小端模式 高字节序 低字节序 MSB LSB

随机推荐

  • qt 绘制 流程图 案例 收集

    参考 C 43 43 中的例子 xff1a Qt Qt5 11 1 Examples Qt 5 11 1 widgets graphicsview diagramscene The Diagram Scene example is an a
  • 获得GPS数据的两种方法 1.读串口

    获得GPS数据一般可通过两种方法 xff0c 读串口及调用gpsapi函数 串口作为硬件设备 xff0c 不能同时被两个程序占用 xff0c gpsapi函数几个应用程序可同时共享端口 1 xff0e 读串口 先找出 gps 使用的串口号
  • 机器人履带底盘的悬挂和传动

    我爸是坦克 xff01 一个履带机器人 一 前言 曾经调研过机器人履带底盘的设计和构造 xff0c 整理一下备忘 本文主要关注自己比较难理解的履带底盘悬挂机构和摇臂式履带底盘传动机构 其中履带底盘的悬挂涉及到克里斯蒂悬挂 xff08 Chr
  • Python爬虫——Scrapy 的基本使用

    文章目录 Python爬虫 Scrapy 的基本使用1 创建 Scrapy 爬虫项目2 Scrapy 创建爬虫文件3 Scrapy 运行爬虫文件 Python爬虫 Scrapy 的基本使用 Scrapy 框架中创建项目 查看配置信息 xff
  • Python爬虫——Scrapy框架使用实例及执行过程

    文章目录 Python爬虫 Scrapy框架使用实例及执行过程1 Scrapy框架使用实例2 Scrapy框架执行过程 Python爬虫 Scrapy框架使用实例及执行过程 1 Scrapy框架使用实例 1 创建scrapy项目 scrap
  • C++基础入门

    文章目录 C 43 43 基础入门1 变量和常量2 关键字3 数据类型4 流程控制5 数组6 函数7 指针8 结构体 C 43 43 基础入门 1 变量和常量 变量和常量 变量 xff1a 数据类型 变量名 61 值 常量 xff1a 宏常
  • 解决CLion的 CMake executable not found:XXX

    解决CLion的 CMake executable not found XXX 问题 CLion不能编译DeepStream项目 xff0c 也不能 build 和 debug了 xff0c 还出现以下提示 xff1a 原因 原因是 cli
  • C++核心编程

    C 43 43 核心编程 1 c 43 43 内存模型 c 43 43 程序执行时将内存大致分为4个区域 代码区 xff1a 存放CPU执行的二进制代码指令 xff0c 由操作系统进行管理全局区 xff1a 存放全局变量和静态变量以及全局常
  • STL技术——STL概述和入门

    文章目录 STL技术 STL概述和入门1 STL简介2 入门案例2 1 vecto存放内置数据类型2 2 vecto存放自定义数据类型2 3 容器嵌套 STL技术 STL概述和入门 1 STL简介 STL介绍 STL xff08 stand
  • 使用keil软件添加.C文件和.H文件到工程

    使用keil软件添加 C文件和 H文件到工程 1 第一步 在所建工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称 xff0c 例如要添加led c和led h文件 xff0c 可以先在HARDWARE文件目录下创建一个命名
  • STL常用容器——String容器的使用

    文章目录 STL常用容器 String容器1 string构造器2 string的赋值操作3 拼接字符串4 字符串查找和替换5 字符串比较6 字符串存取7 字符串插入与删除8 截取字符串 STL常用容器 String容器 string类封装
  • STL常用容器——vector容器的使用

    文章目录 STL常用容器 vector容器的使用1 vector容器概念2 vector容器构造方式3 vector赋值操作4 vector容量 capacity 和大小 size 的区别5 vector添加和删除6 vector数据存取
  • STL常用容器——deque容器的使用

    文章目录 STL常用容器 deque容器的使用1 deque 容器简介2 deque容器的构造函数3 deque的赋值操作4 deque大小操作5 deque容器添加和删除元素6 deque容器访问元素7 容器内元素排序 STL常用容器 d
  • STL常用容器——stack容器的使用

    文章目录 STL常用容器 stack容器的使用1 stack容器介绍2 stack容器常用接口 STL常用容器 stack容器的使用 1 stack容器介绍 stack容器简介 stack容器是堆栈容器 xff0c 该容器具有先进后出的特性
  • STL常用容器——queue容器的使用

    文章目录 STL常用容器 queue容器的使用1 queue容器的介绍2 queue容器常用接口2 1 queue容器构造函数2 2 queue队列容器常用的成员函数 STL常用容器 queue容器的使用 1 queue容器的介绍 queu
  • STL常用容器—— list 容器的使用

    文章目录 STL常用容器 list 容器的使用1 list 容器介绍2 list容器的构造函数3 list容器的赋值和交换4 list容器大小操作5 list容器添加和删除元素操作6 list容器数据存取7 list容器反转和排序 STL常
  • STL常用容器——set容器的使用

    文章目录 STL常用容器 set容器的使用1 set容器简介2 set容器的构造和赋值3 set容器的大小和交换4 set容器的添加与删除5 set容器的查找与统计6 pair类模板7 set和multiset的区别8 set容器的排序 S
  • STL常用容器——map容器的使用

    文章目录 STL常用容器 map容器的使用1 map容器介绍2 map容器构造和赋值3 map容器大小和交换4 map容器的添加和删除4 1 insert插入数据的四种方式4 2 删除键值对 5 map容器查找和统计6 map容器排序 ST
  • STL常用算法——遍历算法

    文章目录 STL常用算法 遍历算法1 for each 2 transform STL常用算法 遍历算法 1 for each for each xff1a 遍历容器 xff0c 对容器中的每一个元素调用函数或函数对象 函数原型 xff1a
  • STL常用算法——查找算法

    文章目录 STL常用算法 查找算法1 find 2 find if 3 adjacent find 4 binary search 5 count 和count if 5 1 count 5 2 count if STL常用算法 查找算法