C++ Primer笔记——查找算法

news2025/1/13 13:08:49

目录

一.简单查找

①find(first, last, val);

②find_if & find_if_not

③count & count_if

④all_of & any_of & none_of

二.重复值的查找

①adjacent_find(first, end);

②search_n(first, end, count, val);

 三.查找子序列

①search(first1, end1, first2, end2);

②find_first_of(first1, end1, first2, end2);

③find_end(first1, end1, first2, end2);


页数:P771(A.2.1查找对象的算法)

算法头文件:<algorithm>

参数注释:

first:序列的起始迭代器

last:序列的结尾迭代器

val:特定的一个值

unaryPred:自定义一元函数,用于自定义查找方式

binaryPred:自定义二元函数,用于自定义查找方式

一.简单查找

①find(first, last, val);

在first与last之间查找值为val的元素。如果有就返回该元素位置(迭代器),无就返回end迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1 , 3, 5, 2, 4, 6 };
	vector<int>::iterator it = find(arr.begin(), arr.end(), 2);
	if (it == arr.end()) cout << "无";
	else cout << "有";
	return 0;
}

②find_if & find_if_not

find_if(first, last, unaryPred);

find_if_not(first, last, unaryPred);

 在first与last之间按指定方式查找元素。如果有就返回该元素位置(迭代器),无就返回end迭代器。

使用示例:

bool func(int n)
{
	if (n == 3) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	vector<int>::iterator it = find_if(arr.begin(), arr.end(), func);
	if (it == arr.end()) cout << "无";
	else cout << "有";
	return 0;
}

③count & count_if

count(first, last, val);

count_if(first, last, unaryPred); 

 在first与last之间,统计val值共出现多少次,返回一个记录出现次数的计数器(本质是int类型)。

 count_if目的与count一致,区别是统计方式不再是具体val值,而是自定义统计方式。

使用示例:

bool func(int n)
{
	if (n == 3 || n == 1 || n == 6) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	int sum = count(arr.begin(), arr.end(), 4);
	cout << sum << endl;
	sum = count_if(arr.begin(), arr.end(), func);
	cout << sum;
	return 0;
}

④all_of & any_of & none_of

all_of(first, last, unaryPred);

any_of(first, last, unaryPred);

none_of(first, last, unaryPred);

在first与last之间,上述三个函数目的分别是:按自定义函数(的方式)查找各元素都成功、对任意一个元素查找成功、所有元素查找都失败。

返回值为bool类型,成功返回true,失败返回false。

bool func(int n)
{
	if (n == 3) return true;
	return false;
}
int main()
{
	vector<int> arr = { 2, 4, 1, 3, 5, 2, 4, 6 };
	if (all_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	cout << endl;
	if (any_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	cout << endl;
	if (none_of(arr.begin(), arr.end(), func)) cout << "TRUE";
	else cout << "FALSE";
	return 0;
}

二.重复值的查找

①adjacent_find(first, end);

要求支持前向迭代器

查找相邻元素是否重复。如果有重复,返回第一对重复元素迭代器;没有则返回end迭代器。

同时该函数有重载类型,第三个参数为自定义函数,用于自定义查找方式:

adjacent_find(first, end, binaryPred);

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 3, 2, 4, 6 };
	vector<int>::iterator it = adjacent_find(arr.begin(), arr.end());

//vector<int> arr = { 2, 4, 1, 3, 3, 2, 4, 6 };
//                             ^
//                             it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

②search_n(first, end, count, val);

查找在first到end之间,是否存在count个相邻的值为val的元素。若存在,返回重复的起始位置迭代器;否则返回end迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0 };
	vector<int>::iterator it = search_n(arr.begin(), arr.end(), 3, 0);
	if (it == arr.end()) cout << "无";
	else cout << *it;
	cout << endl;
	arr = { 2, 4, 1, 3, 0, 0, 0, 3, 2, 0, 4, 6, 0 };
	it = search_n(arr.begin(), arr.end(), 3, 0);

//arr = { 2, 4, 1, 3, 0, 0, 0, 3, 2, 0, 4, 6, 0 };
//                    ^
//                    it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

 三.查找子序列

①search(first1, end1, first2, end2);

在first1到end1之间,查找有无特定子序列,子序列起始为first2,结尾为end2。

如果有,返回在范围first1到end1之间,第一次出现的位置迭代器;否则返回end1迭代器。

使用示例:

int main()
{
	vector<int> arr = { 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
	vector<int> tmp = { 0, 3, 2 };
	vector<int>::iterator it = search(arr.begin(), arr.end(), tmp.begin(), tmp.end());
	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

②find_first_of(first1, end1, first2, end2);

该函数是在first1到end1范围中,查找第一个与first2到end2中任意元素匹配的元素,并返回该位置迭代器;如果没有匹配的,返回end1迭代器。

举个例子,范围1是{3, 2, 3, 4, 5};范围2是{7, 4};那么在查找时,范围1从左到右第一个与范围2中匹配的元素是4。因此,返回4所在的迭代器。

使用示例:

int main()
{
	vector<int> arr = { 3, 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
	vector<int> tmp = { 7, 1, 0, 4};
	vector<int>::iterator it = find_first_of(arr.begin(), arr.end(), tmp.begin(), tmp.end());

//vector<int> arr = { 3, 2, 4, 1, 3, 0, 3, 2, 0, 4, 6, 0, 0, 3, 2 };
//                          ^
//                          it

	if (it == arr.end()) cout << "无";
	else cout << *it;
	return 0;
}

③find_end(first1, end1, first2, end2);

该函数作用与search类似,不同是匹配的是子序列最后一次出现的位置,返回值与search类似。

使用示例:

int main()
{
	vector<int> arr = { 3, 2, 4, 1, 2, 3, 3, 2, 0, 4, 6, 1, 2, 3, 2 };
	vector<int> tmp = { 1, 2, 3};
	vector<int>::iterator it = find_end(arr.begin(), arr.end(), tmp.begin(), tmp.end());

//vector<int> arr = { 3, 2, 4, 1, 2, 3, 3, 2, 0, 4, 6, 1, 2, 3, 2 };
//                                                     ^
//                                                     it

	if (it == arr.end()) cout << "无";
	else cout << *(--it);
	return 0;
}                                          


如有错误,敬请斧正 

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

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

相关文章

基于html+css的图展示86

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Redis事务和Redis管道

什么是Redis事务:Redis事务是指将多条命令加入到队列里面&#xff0c;一次批量执行多条命令&#xff0c;每一条命令会按顺序执行&#xff0c;在事务执行过程中不会受到客户端所传入的命令请求的影响 1)单独的隔离操作:Redis的事务仅仅保证事务 里面的操作会被连续独占的执行&am…

【Rust 日报】2023-05-21 Helix 23.05发布

Helix 23.05发布 Helix 是个文本编辑器&#xff1a; 新版本功能&#xff1a; 为 LSP 引用请求添加一个配置选项&#xff0c;用于排除声明&#xff08;&#xff03;6886&#xff09;。根据文件扩展名和 shebang 启用语言注入&#xff08;&#xff03;3970&#xff09;。通过最近…

Vision-CAIR/MiniGPT-4:使用先进的大型语言模型增强视觉-语言理解

Vision-CAIR/MiniGPT-4&#xff1a;使用先进的大型语言模型增强视觉-语言理解 摘要 视觉-语言理解是人工智能领域的一个重要方向&#xff0c;它涉及到图像和文本之间的复杂交互。近年来&#xff0c;大型语言模型&#xff08;LLM&#xff09;在自然语言处理&#xff08;NLP&am…

【PCIE732】基于 Kintex UltraScale 系列FPGA 的2 路40G 光纤通道适配器(5GByte/s 带宽)/XCKU060

板卡概述 PCIE732 是一款基于PCIE 总线架构的高性能数据传输卡&#xff0c;板卡具有1 个PCIex8 主机接口、2 个QSFP40G 光纤接口&#xff0c;可以实现2路QSFP 40G 光纤的数据实时采集、传输。板卡采用Xilinx 的高性能Kintex UltraScale 系列FPGA 作为实时处理器&#xff0c;板…

【Nginx】反向代理

文章目录 Nginx反向代理概述Nginx反向代理的配置语法proxy_passproxy_set_headerproxy_redirect Nginx反向代理实战Nginx的安全控制如何使用SSL对流量进行加密nginx添加SSL的支持Nginx的SSL相关指令生成证书开启SSL实例 反向代理系统调优 Nginx反向代理概述 关于正向代理和反向…

IIC-EEPROM实验

IIC I2C介绍I2C物理层&#xff08;内部结构&#xff09;I2C协议层数据有效性起始和结束信号应答响应时序图 数据传输软件模拟IIC使用方法产生IIC起始信号产生IIC停止信号产生ACK应答产生nack非应答等待应答信号到来IIC发送一个字节IIC读一个字节 AT24C02介绍硬件设计软件设计实…

chatgpt赋能Python-python_if_非

Python中的if非语句在SEO中的重要性 在Python编程中&#xff0c;if非语句是必不可少的一部分。它让程序员能够编写条件语句&#xff0c;根据不同的条件执行不同的代码。但你知道吗&#xff1f;if非语句也可以对SEO&#xff08;搜索引擎优化&#xff09;产生深远的影响。 什么…

cannot read system data from XML file

最近在使用ccs进行debug仿真时&#xff0c;不知道为什么一直报错&#xff0c;或者偶尔能够正常下载程序。一些报错情况如下&#xff1a; One or more sections of your program falls into a memory region that is not writable. Invalid Target Configuration file 有可能…

【容器化应用程序设计和开发】2.7 云原生开发工具和框架

2.7 云原生开发工具和框架 今天我们就简单来讲一下云原生下用到的开发工具和一些基本的框架。云原生开发工具和框架是为了支持现代化的应用程序开发&#xff0c;能够简化云原生应用程序的构建、部署、管理和维护。下面是一些常见的云原生开发工具和框架&#xff1a; Kubernetes…

给初学者的Vue.js项目搭建教程

部分数据来源&#xff1a;ChatGPT 1. 环境准备 在开始创建 Vue.js 项目前&#xff0c;需要保证已经安装了 Node.js&#xff08;建议版本12&#xff09;和 NPM&#xff08;Node.js 自带的包管理工具&#xff09;。 可以执行以下命令确认是否已经安装&#xff1a; node -v np…

数字孪生智慧灯杆,“多杆合一”降本增效

随着智慧城市建设的不断深入&#xff0c;智慧灯杆作为城市基础设施的重要组成部分&#xff0c;正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段&#xff0c;通过构建路灯物联网&#xff0c;实现了现代化的路灯按需维修和按需照…

【1】安装与配置tensorflow

常见深度学习框架市场占有率 1.创建虚拟环境 打开菜单栏里的 点击creat创建 2.激活虚拟环境 打开命令提示符&#xff0c;输入activate tensorflow 可以看到进入tensorflow环境&#xff1a; 3.更换源 为提高下载速度&#xff0c;执行以下命令&#xff1a; pip config set g…

SpringCloud Ribbon和OpenFeign组件的使用加示意图和详细讲解

目录 SpringCloud Ribbon Ribbon 介绍 LB(Load Balance) LB 分类 1. 集中式LB 2. 进程内LB 实例-前面member-consumer 轮询负载访问10000/10002 底层就是Ribbon 默认的轮询负载算法 Ribbon 架构图&机制 Ribbon 机制 Ribbon 常见负载算法 替换负载均衡算法-应用实…

CCS新建工程教程

1.先点击ccs软件&#xff0c;打开一个工作台&#xff1a; 2.点击“Project”菜单&#xff0c;选择“New CCS Project”项目&#xff0c;新建 CCS 工 程 3. ①&#xff1a;我们开发板上使用的 DSP 芯片是 TMS320F28335&#xff0c;所以这里我们选择 TMS320F28335。 ②&#xff…

一文读懂Vite和Webpack的区别?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、webpack是什么&#xff1f;二、webpack如何工作&#xff1f;三、Vite是什么&#xff1f;Vite和Webpack的区别&#xff1f; 提示&#xff1a;以下是本篇文章正文…

【Nginx】负载均衡

文章目录 负载均衡概述负载均衡的原理及处理流程负载均衡常用的处理方式方式一:用户手动选择方式二:DNS轮询方式方式三:四/七层负载均衡 Nginx七层负载均衡的指令upstream指令server指令 Nginx七层负载均衡的实现流程负载均衡状态负载均衡策略负载均衡案例案例一&#xff1a;对…

“多杆合一”降本增效——数字孪生智慧灯杆

随着智慧城市建设的不断深入&#xff0c;智慧灯杆作为城市基础设施的重要组成部分&#xff0c;正在成为城市智能化和绿色化的重要手段之一。 图扑智慧灯杆系统在城市道路照明领域引入信息化手段&#xff0c;通过构建路灯物联网&#xff0c;实现了现代化的路灯按需维修和按需照…

Windows与Linux系统实现文件互传(通俗易懂)

SCP指令可以实Windows系统与Linux系统之间的文件互传 引言Windows系统文件传输到Linux系统上&#xff08;先操作&#xff09;Windows系统文件传输到Linux系统上&#xff08;再细聊&#xff09;Linux系统文件传输到Windows系统上&#xff08;先操作&#xff09;Linux系统文件传输…

【PCIE702-1】基于Kintex UltraScale系列FPGA的高性能PCIe总线数据预处理载板

板卡概述 PCIE702-1是一款基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用Xilinx的高性能Kintex UltraScale系列FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1路PCIe x8主机接口&#x…