STL之search()算法

news2025/1/12 9:57:23

我们之前介绍的find()算法以及find_if()算法都帮助我们查找判断某一个value是否被包含在序列中,并返回它第一次出现时所处的位置,假如我想找到某一段满足条件的子区间,应该怎么做呢?C++标准库又为我们提供了哪些算法呢?

(下面程序中要用到的algostuff.h)

search_n()        搜寻具有某特性的第一段“n个连续元素”

InputIterator 
search_n(InputItertor beg,InputIterator end,
        Size count,const T& value)

InputIterator
search_n(InputIterator beg,InputIterator end,
        Size count,const T&value,BinaryPredicate op)
  • 第一形式返回区间[beg,end)中第一组”连续count个元素值全等于 value"的元素位置
  • 第二形式返回区间[beg,end)中第一组“连续count个元素造成以下一元判断式结果为true”的元素位置: op(elem,value)
  • 如果没有找到匹配元素,两种形式都返回end
  • op在函数调用过程中不应该改变自身状态
  • op不应变动被传进去的参数

下面这个例子搜寻连续4个“数值大于等于3”的元素:

#include"algostuff.h"
using namespace std;
int main()
{
	deque<int> col;
	INSERT_ELEMENTS(col, 1, 9);
	PRINT_ELEMENTS(col);	//1 2 3 4 5 6 7 8 9

	//find four consecutive elements with value 3
	deque<int>::iterator pos;
	pos = search_n(col.begin(), col.end(), 4, 3);

	//print result
	if (pos != col.end())
	{
		cout << "four consecutive element with value 3 "
			<< "start with " << distance(col.begin(), pos) + 1 << ".element" << endl;
	}
	else
	{
		cout << "no four consecutive elements with value 3 not found" << endl;
	}
	//no four consecutive elements with value 3 not found
	

	//find four consecutive elements with value greater than 3
	pos = search_n(col.begin(), col.end(), 4, 3, greater<int>());
	//print result
	if (pos != col.end())
	{
		cout << "four consecutive elements with value > 3 "
			<< "start with " << distance(col.begin(), pos) + 1
			<< ". element" << endl;
	}
	else
	{
		cout << "no four consecutive elements with value > 3 found " << endl;
	}

}

 运算结果如下:

 

search()        搜寻某个子区间第一次出现位置

ForwardIterator1
search(ForwardIterator1 beg,ForwardIterator1 end,
        ForwardIterator2 searchBeg,ForwardIterator2 searchEnd)

ForwardIterator1
search(ForwardIterator1 beg,ForwardIterator1 end,
        ForwardIterator2 searchBeg,ForwardIterator2 searchEnd,
        BinaryPredicate op)
  • 两种形式都返回区间[beg,end)内“和区间[searchBeg,searchEnd)完全吻合”的第一个子区间的第一个元素位置
  • 第一形式中,子区间的元素必须完全等于[searchBeg,searchEnd)中的元素
  • 第二形式中,子区间的元素和[searchBeg,searchEnd)里面的对应元素必须造成以下二元判断式的结果为true:       op(elem,searchElem)
  • 如果没有找到符合条件的子区间,两种形式都返回end
  • op在函数调用过程中不应改变自身状态
  • op不应变动传入的参数

下面这个例子展示如何在另一个序列中搜寻一个子序列

#include"algostuff.h"
using namespace std;
int main()
{
	deque<int> col;
	list<int> subcol;

	INSERT_ELEMENTS(col, 1, 7);
	INSERT_ELEMENTS(col, 1, 7);
	PRINT_ELEMENTS(col, "col: ");	//col: 1 2 3 4 5 6 7 1 2 3 4 5 6 7

	INSERT_ELEMENTS(subcol, 3, 6);
	PRINT_ELEMENTS(subcol, "subcol: ");	//subcol: 3 4 5 6

	//search first occurrence of subcol in col
	deque<int>::iterator pos;
	pos = search(col.begin(), col.end(), subcol.begin(), subcol.end());
	//loop while subcol found as subrange of col
	while (pos != col.end())
	{
		//print position of first element
		cout << "subcol found starting with element "
			<< distance(col.begin(), pos) + 1
			<< endl;
		//search next occurrence of subcol
		++pos;
		pos = search(pos, col.end(), subcol.begin(), subcol.end());
	}
}

 

下面这个程序展示如何利用search()算法的第二形式 ,以更复杂的准则来搜寻某个子序列,这里寻找的是“偶数、奇数、偶数”排列而成的子序列区间

#include"algostuff.h"
using namespace std;

//checks whether an element is even or odd
bool checkEven(int elem, bool even)
{
	if (even)
	{
		return elem % 2 == 0;
	}
	else
	{
		return elem % 2 == 1;
	}
}

int main()
{
	vector<int> col;
	INSERT_ELEMENTS(col, 1, 9);
	PRINT_ELEMENTS(col, "col:");	//col:1 2 3 4 5 6 7 8 9

	bool checkEvenArgs[3] = { true,false,true };

	//search first subrange in col
	vector<int>::iterator pos;
	pos = search(col.begin(), col.end(),    //range
		checkEvenArgs, checkEvenArgs + 3,   //subrange values
		checkEven);							//subrange criterion

	//loop while surange found
	while (pos != col.end())
	{
		//print position of first element
		cout << "subrange found starting with element "
			<< distance(col.begin(), pos) + 1 << endl;
		//search next subrange in col
		pos = search(++pos, col.end(),			//range
			checkEvenArgs, checkEvenArgs + 3,	//subrange values
			checkEven);							//criterion
	}


}

运行结果如下: 

(以上表示共找出三个满足“偶、奇、偶”条件的子序列,分别从元素2,4,6开始) 

find_end()        搜寻某个子区间最后一次出现位置

ForwardIterator 
find_end(ForwardIterator beg,ForwardIterator end,
        ForwardIterator searchBeg,ForwardIterator searchEnd)

ForwardIterator
find_end(ForwardIterator beg,ForwardIterator end,
        ForwardIterator searchBeg,ForwardIterator searchEnd,
        BinaryPredicate op)
  • 两种形式都返回区间[beg,end)之中“和区间[searchBeg,searchEnd)完全吻合”的最后一个子区间内的第一个元素位置
  • 第一形式中,子区间的元素必须完全等于[searchBeg,searchEnd)的元素
  • 第二形式中,子区间的元素和[searchBeg,searchEnd)的对应元素必须造成以下二元判断式的结果为true:           op(elem,searchElem)
  • 如果没有找到符合条件的子区间,两种形式都返回end
  • op在函数调用过程中不应该改变自身状态
  • op不应改动传入的参数

下面这个例子展示如何在一个序列中搜寻“与某序列相等”的最后一个子序列

#include"algostuff.h"
using namespace std;
int main()
{
	deque<int> col;
	list<int> subcol;
	INSERT_ELEMENTS(col, 1, 7);
	INSERT_ELEMENTS(col, 1, 7);

	INSERT_ELEMENTS(subcol, 3, 6);

	PRINT_ELEMENTS(col, "col: ");	//col: 1 2 3 4 5 6 7 1 2 3 4 5 6 7
	PRINT_ELEMENTS(subcol, "subcol: ");	//subcol: 3 4 5 6

	//search last occurrence of subcol in col
	deque<int>::iterator pos;
	pos = find_end(col.begin(), col.end(), //range
		subcol.begin(), subcol.end());	//subrange

	//loop while subcol found as subrange of col
	deque<int>::iterator end(col.end());
	while (pos != end)
	{
		//print position of first element
		cout << "subcol found starting with element "
			<< distance(col.begin(), pos) + 1 << endl;

		//search nect occurrence of subcol
		end = pos;
		pos = find_end(col.begin(), end, subcol.begin(), subcol.end());
	}
}

 

find_first_of()        搜寻某些元素的第一次出现地点

ForwardIterator 
find_first_of(ForwardIterator1 Beg,ForwardIterator1 end,
                ForwardIterator2 searchBeg,ForwardIterator2 searchEnd)

ForwardIterator 
find_first_of(ForwardIterator1 Beg,ForwardIterator1 end,
                ForwardIterator2 searchBeg,ForwardIterator2 searchEnd,
                BinaryPredicate op)
  • 第一形式返回第一个“既在[beg,end)中出现,也在区间[searchBeg,searchEnd)中出现”的元素的位置
  • 第二形式返回区间[beg,end)中第一个这样的元素:它和区间[searchBeg,searchEnd)内每一个元素进行以下动作的结果都是true:        op(elem,searchElem)
  • 如果没有找到吻合元素,两种形式都返回end
  • op在调用过程中不应改变自身状态
  • op不应改动传入的参数

下面展示find_first_of()的用法

#include"algostuff.h"
using namespace std;
int main()
{
	vector<int> col;
	list<int> searchcol;

	INSERT_ELEMENTS(col, 1, 11);
	INSERT_ELEMENTS(searchcol, 3, 5);

	PRINT_ELEMENTS(col, "col: ");	//col: 1 2 3 4 5 6 7 8 9 10 11
	PRINT_ELEMENTS(searchcol, "searchcol: ");	//searchcol: 3 4 5

	//search first occurrence of an element of searchcol in col
	vector<int>::iterator pos;
	pos = find_first_of(col.begin(), col.end(),	//range
		searchcol.begin(), searchcol.end());	//search range

	cout << "first element of searchcol in col is element "
		<< distance(col.begin(), pos) + 1 << endl;

	//search last occurrence of an element of searchcol in col
	vector<int>::reverse_iterator rpos;
	rpos = find_first_of(col.rbegin(), col.rend(), searchcol.begin(), searchcol.end());
	cout << "last element of searchcol in col is element "
		<< distance(col.begin(), rpos.base()) << endl;

}

 

adjacent _find()        搜寻两个连续相等的元素

InputIterator
adjacent_find(InputIterator beg,InputIterator end)

InputIterator
adjacent_find(InputIterator beg,InputIterator end, BinaryPredicate op)
  • 第一形式返回区间[beg,end)中第一对“连续两个相等元素”之中的第一元素位置
  • 第二形式返回区间[beg,end)中第一对“连续两个元素均使以下二元判断式的结果为true”的其中第一元素位置:       op(elem,nectElem)
  • 如果没有找到吻合元素,两者都返回end
  • op在函数调用过程中不应该改变自身状态
  • op不应改动传入的参数

下面展示adjacent_find()算法的用法

#include"algostuff.h"
using namespace std;

//return whether the second object has double the value of the first
bool doubled(int elem1, int elem2)
{
	return elem1 * 2 == elem2;
}
int main()
{
	vector<int> col;
	col.push_back(1);
	col.push_back(3);
	col.push_back(2);
	col.push_back(4);
	col.push_back(5);
	col.push_back(5);
	col.push_back(0);

	PRINT_ELEMENTS(col, "col: ");
	// search first two elements with equal value
	vector<int>::iterator pos;
	pos = adjacent_find(col.begin(), col.end());
	if (pos != col.end())
	{
		cout << "first two elements with equal value have position "
			<< distance(col.begin(), pos) + 1 << endl;
	}
	//search first two elements for which the second has double the value of the first
	pos = adjacent_find(col.begin(), col.end(), doubled);
	if (pos != col.end())
	{
		cout << "first two elements with second value twice the first have pos. "
			<< distance(col.begin(), pos) + 1 << endl;
	}
}

search_n()搜寻具有某特性的第一段“n个连续元素”
search()搜寻某个子区间第一次出现位置
find_end()搜寻某个子区间最后一次出现的位置
find_first_of()搜寻某些元素第一次出现地点
adjacent_find()搜寻两个连续且相等的元素

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

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

相关文章

2023年4月《中国数据库行业分析报告》正式发布(含精彩内容概览)

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

C语言课设项目-51单片机-红外通信

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 一. 什么是红外线 二. 红外线系统的组成 三. 红外发射管 四. 红外遥控器发射 五. 红外线接收 六.数…

还能这么玩?清华给 ChatGPT 做逆向,发现了 ChatGPT 的进化轨迹!

作者 |小戏、Python 立足一个 ChatGPT&#xff0c;现在对大模型的研究简直是百花齐发百家争鸣&#xff0c;用 ChatGPT 做化学实验、给 ChatGPT 做心理测试、诱导 ChatGPT 越狱泄漏隐私、让几个 ChatGPT 形成一个小社会等等不胜枚举。 而最近&#xff0c;清华的研究团队又在大模…

深度学习01-tensorflow开发环境搭建

文章目录 简介运行硬件cuda和cuddntensorflow安装。安装Anaconda创建python环境安装tensorflow-gpupycharm配置配置conda环境配置juypternotebook 安装cuda安装cudnn 简介 TensorFlow是一种端到端开源机器学习平台&#xff0c;它提供了一个全面而灵活的生态系统&#xff0c;包…

unity进阶学习笔记:有限状态机

一般来说&#xff0c;每一个游戏物体会有多种状态&#xff0c;每一个状态会对应一个特定动画。如一个游戏角色可能有静止状态&#xff0c;移动状态&#xff0c;攻击状态。每一个状态里都有对应的动画。如果我们只是简单使用一个个if语句判断玩家进行哪个控制来切换动画会让程序…

一文打尽目标检测NMS(2): 效率提升篇

文章来自于&#xff1a;曲終人不散丶知乎&#xff0c; 连接&#xff1a;https://zhuanlan.zhihu.com/p/157900024&#xff0c; 本文仅用于学术分享&#xff0c;如有侵权&#xff0c;前联系后台做删文处理。 在笔者上一篇文章《一文打尽目标检测NMS——精度提升篇》中&#xff0…

博客系统后端设计(三) - 实现获取博客列表页功能

文章目录 实现获取博客列表页功能1. 约定前后端交互接口2. 实现后端代码3. 实现前端代码4. 测试代码5. 涉及到的两个 Bug 实现获取博客列表页功能 当前的博客列表上的数据都是写死的&#xff0c;符合逻辑的做法是&#xff0c;通过数据库读取数据后显示到页面上。 此处就需要打…

【Linux】2.2 环境基础开发工具使用——vim

文章目录 什么是 vimvim 的基本操作vim 指令集Normal mode 指令集插入模式复制粘贴撤销剪切光标移动删除 last line mode 指令集列出行号跳到文件中的某一行查找字符保存文件 vim 的配置 什么是 vim Linux editor —— vim ——多模式的编辑器每种模式有差异&#xff0c;模式之…

人工智能洗稿-免费自媒体洗稿工具

文字洗稿 文字洗稿是指通过修改、重组、删除、替换等手段对文本进行优化、清理和调整&#xff0c;以达到改善文章质量、增加独特性和提高可读性的目的。文字洗稿是自媒体行业的一个重要需求&#xff0c;尤其是在批量撰写文章或需要大量修改文本的情况下。文字洗稿分为自动洗稿…

记一次springboot项目漏洞挖掘

前言 前段时间的比赛将该cms作为了题目考察&#xff0c;这个cms的洞也被大佬们吃的差不多了&#xff0c;自己也就借此机会来浅浅测试下这个cms残余漏洞&#xff0c;并记录下这一整个流程&#xff0c;谨以此记给小白师傅们分享下思路&#xff0c;有错误的地方还望大佬们请以指正…

云办公时代,企业如何保护数据资产安全?

云办公是一种基于云计算技术的办公方式&#xff0c;它将传统的办公软件和数据存储方式转移到了云端服务器上。用户可以通过互联网访问各种办公应用程序和数据&#xff0c;实现远程协作、移动化办公和信息共享等功能。 常见的云办公应用包括文档处理、电子邮件、日历、在线会议、…

ABAP 锁对象

需求场景 最近收到用户反馈&#xff0c;发现同一个托运单生成了两个不同的服务订单以及根据同一个送货单生成了两个托运单&#xff0c;经过排查&#xff0c;发现原因都是由同样的问题导致的&#xff0c;多窗口或者多用户同时对一条数据操作&#xff0c;就会出现这种现象。这个…

Learning C++ No.19【搜索二叉树实战】

引言&#xff1a; 北京时间&#xff1a;2023/5/2/9:18&#xff0c;五一放假第四天&#xff0c;昨天本来想要发奋图强将该篇博客写完&#xff0c;但是摆烂了一天&#xff0c;导致已经好几天没有码字&#xff0c;敲代码了&#xff0c;此时难受的感觉涌上心头&#xff0c;但是摆烂…

DNF类游戏动作实现(C语言)

没有接触制作小游戏前&#xff0c;感觉做游戏很不可思议&#xff0c;游戏里的人物是怎么移动的&#xff0c;怎么攻击&#xff0c;释放技能。。。。。。现在逐渐了解到之后&#xff0c;发现2d游戏人物的动作更多是图片的拼接&#xff0c;动作是否精细&#xff0c;由这个动作的帧…

鲲鹏展翅 信安高飞 | 鲲鹏开发者峰会2023-麒麟信安技术论坛成功举办!

2023年5月6日-7日&#xff0c;以“创未来 享非凡”为主题的鲲鹏开发者峰会2023在东莞松山湖举办。鲲鹏产业生态繁荣&#xff0c;稳步发展&#xff0c;正在成为行业核心场景及科研领域首选&#xff0c;加速推动数字化转型。 作为鲲鹏生态重要合作伙伴&#xff0c;麒麟信安受邀举…

企企通:B2B商城四种“玩法”,一站式解决端到端全链路需求!

商城系统在电商零售领域中&#xff0c;一直是助力商家搭建商城的核心工具&#xff0c;随着电商行业的发展&#xff0c;各种新模式随即出现&#xff0c;与此同时也出现了各种各样的商城系统&#xff0c;而B2B商城是这其中最为常见的商城系统。 近年来&#xff0c;由于电子商务的…

相遇于此,相交链表的解题心得

本篇博客会讲解力扣“160. 相交链表”的解题思路&#xff0c;这是题目链接。 老规矩&#xff0c;先来审题。这道题的题干有点长&#xff0c;简而言之&#xff0c;就是判断2个链表是否相交&#xff0c;如果相交就返回第一个相交结点&#xff0c;不相交就返回NULL。看看题目原文…

【C++中可调用对象和function】

C中有如下几种可调用对象&#xff1a;函数、函数指针、lambda表达式、bind对象、仿函数。其中&#xff0c;lambda表达式和bind对象是C11标准中提出的(bind机制并不是新标准中首次提出&#xff0c;而是对旧版本中bind1st和bind2st的合并)。个人认为五种可调用对象中&#xff0c;…

FM33A048B LPUART

概述 LPUART 是一个低功耗UART 接口&#xff0c;其工作仅需32768Hz 时钟&#xff0c;可以支持到最高9600 波特率的数据接收。LPUART 功耗极低&#xff0c;可以在Sleep/DeepSleep 模式下工作。 特点&#xff1a; ⚫ 异步数据收发 ⚫ 标准UART帧格式 ◼ 1bit起始位 ◼ 7或8bit数据…

【ChatGPT Prompt Engineering】面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…