【C++常用算法】STL基础语法学习 | 查找算法

news2024/12/24 8:23:44


目录

●find

●find_if 

●adjacent_find

●binary_ search 

●count

●count_if


 ●find

1.功能描述:

        查找指定元素,如果找到则放回指定元素的迭代器,若未找到则返回结束迭代器。

2.查看find定义下底层代码的函数原型:

3.内置数据类型的查找:

        向deque容器中插入5个元素,使用find去分别查询元素5和元素10是否在容器中。

#include<iostream>
#include<algorithm>
#include<deque>
using namespace std;
void find_func(deque<int>&d)
{
	cout << "输入你要查找的元素:";
	int n; cin >> n;
	deque<int>::iterator p;   //迭代器
	p = find(d.begin(), d.end(), n);  //内置数据类型查找
	if (p != d.end())
		cout << "找到该元素" << endl;
	else
		cout << "未找到该元素" << endl;
}
void text()
{
	deque<int>d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.push_back(4);
	d.push_back(5);
	//内置数据类型的查找
	find_func(d);
}
int main()
{
	text();
}

4.自定义数据类型的查找

        向deque容器中插入已构造好的5个人,使用find去查询指定姓名和年龄下的这个人是否存在。

#include<iostream>
#include<algorithm>
#include<deque>
#include<string>
using namespace std;
class person {
public:
	string name;
	int age;
	//构造函数(姓名+年龄)
	person(string name, int age)
	{
		this->name = name;
		this->age = age;
	}
	//重载operator== 让底层的find知道如何去对比person的数据类型
	bool operator==(const person &p)
	{
		if (this->name==p.name&&this->age==p.age)
			return 1;
		else
			return 0;
	}
};
void find_func(deque<person>&d)  //指定查找
{
	cout << "请输入要查找的人的姓名:";
	string name; cin >> name;
	cout << "请输入要查找的人的年龄:";
	int age; cin >> age;
	person p_target(name,age);  //通过构造函数将要查找的姓名和年龄

	deque<person>::iterator p;   //迭代器
	p = find(d.begin(), d.end(), p_target);  //查找,将会用到类里面我们重新重载的operator== 

	if (p != d.end())
		cout << "找到该人" <<" "<< p->name << " " << p->age << endl;
	else
		cout << "未找到该人" << endl;
}
void text()
{
	//通过person构造函数去创建5个人
	person p1("张三", 19);
	person p2("李四", 30);
	person p3("王五", 40);
	person p4("赵六", 29);
	person p5("孙七", 20);

	//将这5个人插入deque容器中
	deque<person>d;
	d.push_back(p1);
	d.push_back(p2);
	d.push_back(p3);
	d.push_back(p4);
	d.push_back(p5);

	//进行指定查找
	find_func(d);
}
int main()
{
	text();
}


●find_if 

1.功能描述:

        按照条件去查找元素

2.查看find定义下底层代码的函数原型:

3.内置数据类型的条件查找:

        向deque容器中插入5个元素,使用find_if去条件查询是否容器中有大于3的元素。

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
class search_target_value {
public:
	bool operator()(const int value)
	{
		return value > 3;
	}
};
void find_if_func(deque<int>&d)
{
	deque<int>::iterator p;   //迭代器
	p=find_if(d.begin(), d.end(), search_target_value());  //条件查询
	if (p == d.end())
		cout << "未找到这类元素" ;
	else
		cout << "找到这类元素" << endl;
}
void text()
{
	deque<int>d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(3);
	d.push_back(4);
	d.push_back(5);
	//内置数据类型查找
	find_if_func(d);
}
int main()
{
	text();
}

 4.自定义类型的条件查找:

         向deque容器中插入已构造好的5个人,使用find_if去条件查询年龄大于20下的人是否存在,并且输出这些人的姓名和年龄。

#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
class person {
public:
	string name;
	int age;
	person(string name,int age)
	{
		this->name = name;
		this->age = age;
	}
};
class search_target_value {
public:
	bool operator()(person &p)   //在重载中指明是将年龄与20岁作比较,否则程序条件查询不能执行,程序错误
	{
		return p.age > 20;  
	}
};
void find_if_func(deque<person>&d)
{
	deque<person>::iterator p;  //迭代器
	while(d.size()!=0)
	{
		p = find_if(d.begin(), d.end(), search_target_value());  //条件查询
		if (p != d.end()) 
		{
			cout << "此人为:" << p->name << " " << p->age << endl;
		}	

		int count=0;   //计数
		int begin_sign = d.begin()->age;//将每一次循环的容器队头元素下的年龄赋值在begin_sign下,从而用来下面的判断
		p++;  
		while (p->age != begin_sign)  //当此时指针p下指向的age的值不为begin_sign的值时,执行while循环
		{ 
			count++; 
			p--;   //每一次的循环使指针前移
		}
		for(int j=1;j<=count;j++)   //通过循环去执行count次出deque容器的操作
		{ 
			d.pop_front();   //出
		}
	}
}
void text()
{
	//通过person构造函数去创建5个人
	person p1("张三", 19);
	person p2("李四", 30);
	person p3("王五", 40);
	person p4("赵六", 29);
	person p5("孙七", 12);

	//将这5个人插入deque容器中
	deque<person>d;
	d.push_back(p1);
	d.push_back(p2);
	d.push_back(p3);
	d.push_back(p4);
	d.push_back(p5);

	//自定义数据类型查找
	find_if_func(d);
}
int main()
{
	text();
}


●adjacent_find

1.功能描述:

        查找相邻重复元素

2.查看adjacent_find定义下底层代码的函数原型:

3.向deque容器中插入6个元素,使用adjacent_find去查找这6个元素中是否有相邻的重复元素,并且输出其相邻重复元素值。

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
void adjacent_find_func(deque<int>&d)
{
	deque<int>::iterator p;
	p = adjacent_find(d.begin(), d.end());   //查找相邻重复元素,并且会返回相邻元素的第一个位置的迭代器
	if (p != d.end())
		cout << "找到相邻重复元素:" << *p << endl;
	else
		cout << "未找到相邻重复元素" << endl;
} 
void text()
{
	deque<int>d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(1);
	d.push_back(3);
	d.push_back(4);
	d.push_back(4);
	//查找相邻的重复元素 1 2 1 3 [4 4]
	adjacent_find_func(d);
}
int main()
{
	text();
}


●binary_ search 

1.功能描述:       

        查找指定元素是否存在

2.查看binary_search定义下底层代码的函数原型:

3.向deque容器中顺序插入10个元素,使用binary_search去查找指定元素是否在容器中

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
void binary_search_func(deque<int>&d)
{
	cout << "请输入要查找的元素:";
	int n; cin >> n;
	//binary_search 查找返回的值为一个bool类型,而不是迭代器
	bool ret = binary_search(d.begin(), d.end(),n);
	if (ret == 1)
		cout << "找到该元素" << endl;
	else
		cout << "未找到该元素" << endl;
}
void text()
{
	deque<int>d;
	for (int i = 1; i <= 10; i++)
	{
		d.push_back(i);
	}
	//binary_search底层代码是二分查找法,它操作的容器中元素必须为有序序列,无序的可能返回错误值
	binary_search_func(d);
}
int main()
{
	text();
}


●count

1.功能描述:

        统计元素个数

2.查看count定义下底层代码的函数原型:

3.内置数据类型下deque容器中指定元素的判断与统计:

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
void count_func(deque<int>&d)
{
	cout << "输入要统计的元素:";
	int n; cin >> n;
	int num = count(d.begin(), d.end(), n);
	if (num != 0)
		cout << "该元素存在并且统计个数为:" << num << endl;
	else
		cout << "该元素不存在无法统计" << endl;
}
void text()
{
	deque<int>d;
	d.push_back(1);
	d.push_back(2);
	d.push_back(2);
	d.push_back(3);
	d.push_back(4);
	count_func(d);
}
int main()
{
	text();
}

4. 自定义数据类型的统计,输入一个新人(姓名+年龄),判断此刻deque容器中与该新人年龄相同的人是否存在并且统计其相同年龄人员个数:

#include<iostream>
#include<deque>
#include<algorithm>
#include<string>
using namespace std;
class person {
public:
	string name;
	int age;
	person(string name,int age)
	{
		this->name = name;
		this->age = age;
	}
	//自定义数据类型的统计需要重新去进行重载operator==
	bool operator==(const person &p)
	{
		if (this->age == p.age)
			return 1;
		else
			return 0;
	}
};
void count_func(deque<person>&d)
{
	cout << "请输入一个新人的姓名和年龄:";
	string name; cin >> name;
	int age; cin >> age;
	person p(name, age);

	int num = count(d.begin(), d.end(), p);
	if (num != 0)
		cout << "与该新人年龄相同的人存在,并且有" << num << "个" << endl;
	else
		cout << "与该新人年龄相同的人不存在" << endl;
}
void text()
{
	person p1("张三", 19);
	person p2("李四", 30);
	person p3("王五", 40);
	person p4("赵六", 40);
	person p5("孙七", 12);

	deque<person>d;
	d.push_back(p1);
	d.push_back(p2);
	d.push_back(p3);
	d.push_back(p4);
	d.push_back(p5);

	count_func(d);
}
int main()
{
	text();
}


 ●count_if

1.功能描述:

        按照条件去统计元素个数

2.查看count_if定义下底层代码的函数原型:

3.内置数据类型去条件统计deque容器中大于5的元素是否存在并且输出其有多少个。

#include<iostream>
#include<deque>
#include<algorithm>
using namespace std;
class statistics {
public:
	bool operator()(int value)
	{
		return value > 5;
	}
};
void find_if_func(deque<int>&d)
{
	int num = count_if(d.begin(), d.end(), statistics());
	if (num != 0)
		cout << "大于5的元素存在,并且有" << num << "个" << endl;
	else
		cout << "大于5的元素不存在" << endl;
}
void text()
{
	deque<int>d;
	for (int i = 1; i <= 10; i++)
	{
		d.push_back(i);
	}
	//1 2 3 4 5 6 7 8 9 10
	//内置数据类型的条件统计
	find_if_func(d);
}
int main()
{
	text();
}


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

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

相关文章

Day849.ThreadLocal线程本地存储模式 -Java 性能调优实战

ThreadLocal线程本地存储模式 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于ThreadLocal线程本地存储模式的内容。 民国年间某山东省主席参加某大学校庆演讲&#xff0c;在篮球场看到十来个人穿着裤衩抢一个球&#xff0c;观之实在不雅&#xff0c;于是怒斥学校的…

用于安全医疗保健系统的基于机器学习的可伸缩区块链架构

文章目录背景相关技术简介区块链扩张性电子病历数据安全安全医疗保健的架构基于可扩展区块链架构的机器学习概述基于可扩展区块链架构的机器学习工作流程小结摘要从3.0到4.0的工业革命已经改变了医疗保健环境。患者电子健康记录(EHR)与医学研究机构共享&#xff0c;用于临床研究…

12月榜单丨B站UP主排行榜(飞瓜数据B站)发布!

飞瓜轻数发布2022年12月飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B站UP主。飞瓜…

Python:python简介

1&#xff1a;特点 一种解释型&#xff0c;面向对象&#xff0c;动态数据类型的开源高级程序设计语言 其特点就是&#xff1a;优雅&#xff0c;明确&#xff0c;简单&#xff0c;完善的基础代码库和大量的第三方库。 2&#xff1a;解释VS解释 3&#xff1a;应用场景 python…

基于androidstudio校园快递APP系统的设计与实现

1.课题背景及研究的目的和意义 1.1 课题背景 在其发展速度可谓一日千里的电子商务时代&#xff0c;大学生群体已成为网络购物群体中不可或缺的一部分。因此&#xff0c;高校师生对网购的需求也愈来愈强烈&#xff0c;校园快递的问题也成为了焦点&#xff0c;其中校园快递代理…

98%的数据被浪费,企业该如何释放数据价值?

在数字经济时代&#xff0c;对于广大企业来说&#xff0c;数据就是生产资料&#xff0c;算力则是生产力。飞速增长的业务数据&#xff0c;为现代企业提供了最具价值的资产。然而另一方面&#xff0c;如何存储、清理、管理、挖掘、运用数据&#xff0c;也给广大企业提出了艰巨的…

4天带你上手HarmonyOS ArkUI开发——《HarmonyOS ArkUI入门训练营之健康生活实战》

《HarmonyOS ArkUI入门训练营之健康饮食应用》是面向入门开发者打造的实战课程系列。特邀华为终端BG高级开发工程师作为本次训练营讲师&#xff0c;以健康饮食为例&#xff0c;开展技术教学及实战案例分享&#xff0c;助力入门开发者快速提升技能实力进阶。 目标学员 入门开发者…

apache httpClient关于cookie解析的报错处理

报错信息&#xff1a;o.a.h.c.p.ResponseProcessCookies - Invalid cookie header: "Set-Cookie: account"xxxxx"; expiresFri, 03 Feb 2023 06:02:40 GMT; httponly; Path/". Invalid expires attribute: Fri, 03 Feb 2023 06:02:40 GMThttpClient版本&am…

4年翻4倍年薪30W+的测试工程师个人成长之路

欢迎同行来交流&#xff0c;wx 群二维码应该过不了审核&#xff0c;私聊要把。税收图保证真实性。 一、何为测试 简单做一下科普。测试简而言之就是应用上线前&#xff0c;验证应用是否存在bug&#xff0c;是否满足产品的需求。大家津津乐道的程序员&#xff0c;也就是开发&am…

stm32 的 ESP8266 wifi 模块 (ESP - 12s) 的使用

1. ESP8266 的器件介绍 2. ESP2866外设 的引脚 3. 我所用的的ESP2866 的引脚图 4. 代码 编程的串口 5.wifi 的指令 1. AT 测试指令 2. ATRST 重启模块 3. ATGMR 查看版本信息 4. ATRESTORE 恢复出厂设置 5. ATUART115200,8,1,0,0 串口设置 串口号&#xff…

【SpringBoot应用篇】SpringBoot 业务代码中常用技巧

【SpringBoot应用篇】SpringBoot 业务代码中常用技巧自定义拦截器自定义过滤器过滤器和拦截器的区别获取Spring容器对象BeanFactoryAware接口ApplicationContextAware接口ApplicationListener接口全局异常处理类型转换器参数解析器Import导入配置普通类配置类ImportSelectorImp…

异地旁路组网:zerotier

有这么一个需求&#xff1a;需要远程访问内网的nas。然后现成的解决方案有蒲公英这个方案&#xff0c;但是个人版的话限了只能3个设备&#xff0c;因此找了半天&#xff0c;最后选择了功能类似的zerotier. 创建网络 zerotier的使用很简单&#xff0c;首先去官网http://zeroti…

vue 时间栏选择

效果图&#xff1a; 用el-carousel 的轮播组件 将样式修改 添加change事件 区分左右点击 获取当前年 和 当前月 <el-carouseltrigger"click"height"36px":autoplay"false"arrow"always"change"carouselChange"><e…

Leetcode.189 轮转数组

题目链接 Leetcode.189 轮转数组 题目描述 给你一个数组&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步:[7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5…

数据分析师最佳选择,帆软自研函数计算满足BI复杂场景需求

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业伴随着数字经济的加快推进和企业数字化转型的不断深入&#xff0c;数据时代正在朝我们走来。越来越多的企业管理者已经意识到数据的重要性&#xff0c;数据分析和商业智能也成为管理决策的重要辅助工具&#xff0c;由此而生…

几个潜在的AI科研助手

最近看到一个新闻说ChatGPT被某科研文章列为作者之一。以自然语言处理和深度学习为基础的人工智能在语言修改润色和翻译方面表现优异&#xff0c;似乎还将改变一些传统的论文阅读和写作方式。本文记录几个最近了解到的几个工具。Scispace地址&#xff1a;https://typeset.io/搜…

详细解析各种TCP漏洞攻击方式及防御方法

TCP/IP攻击是利用IP地址并不是出厂的时候与MAC固定在一起的&#xff0c;攻击者通过自封包和修改网络节点的IP地址&#xff0c;冒充某个可信节点的IP地址&#xff0c;进行攻击。 由于TCP/IP协议是Internet的基础协议&#xff0c;所以对TCP/IP协议的完善和改进是非常必要的。TCP…

Redis 异地双活实战

本文主要讲述异地双活方案redis的热备、双写、双向同步的区别和优劣势。并且说明了双写同步方案中redis集群主从数据同步的过程&#xff0c;以及中间件方案遇到的部分问题点&#xff0c;说明最终方案的实现思路和方案。 redis的双活方案无非有以下三种&#xff1a;热备&#xf…

是否只能搞底层才能成为技术大神?

hi&#xff0c;大家好&#xff0c;我是大师兄alex&#xff0c;想必大家经常听到&#xff0c;想要长远发展&#xff0c;必须要往底层走&#xff0c;技术大神都是搞底层的&#xff0c;你会看到很多人一旦想变得硬核&#xff0c;都喜欢展现自己搞过一些底层技术&#xff0c;比如体…

配置热更新/支持 Reload、QUIC 桥接再升级

12 月&#xff0c;NanoMQ 继续保持稳步更新&#xff0c;最新的 0.15 版本将于本月初发布。这一版本增加了配置热更新功能和 Reload 命令&#xff1b;MQTT over QUIC 桥接再次得到升级&#xff0c;增加了拥塞控制和 QoS 消息优先传输&#xff1b;另外也为上一个版本新增的 HOCON…