当前位置: 首页 > news >正文

STL——查找算法

算法简介:

  • find ——//查找元素
  • find_if ——//按条件查找元素
  • adjacent_find ——//查找相邻重复元素
  • binary_search ——//二分查找法
  • count ——//统计元素个数
  • count_if ——//按条件统计元素个数

1.find

函数原型:

  • find(iterator beg, iterator end, value);——// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置;beg 开始迭代器;end 结束迭代器;value 查找的元素
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<string>
//find——查找算法
//查找内置数据类型
void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>::iterator it = find(v.begin(), v.end(), 5);if (it == v.end()){cout << "没有找到!" << endl;}else{cout << "找到了:" << *it << endl;}
}
//查找自定义数据类型
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}//重载 == 让底层find知道如何对比Person数据类型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()
{vector<Person>v;//创建数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);Person p5("eee", 50);//导入数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person pp("ccc", 30);vector<Person>::iterator it = find(v.begin(), v.end(), pp);if (it == v.end()){cout << "没有找到!" << endl;}else{cout << "找到了:name = " << (*it).m_name << " age = " << it->m_age << endl;}
}
int main()
{//test01();test02();system("pause");return 0;
}

2.find_if

函数原型:

  • find_if(iterator beg, iterator end, _Pred);——// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置;beg 开始迭代器;end 结束迭代器; _Pred 函数或者谓词(返回bool类型的仿函数)
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//find_if——查找算法
class GreatFive
{
public:bool operator ()(int val){if (val > 5){return true;}else{return false;}}
};
//查找内置数据类型
void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>::iterator it = find_if(v.begin(), v.end(), GreatFive());if (it == v.end()){cout << "没有找到大于5的数:" << endl;}else{cout << "找到了:" << *it << endl;}
}
//查找自定义数据类型
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};
class Great20
{
public:bool operator()(Person p){return p.m_age > 20;}
};
void test02()
{vector<Person>v;//创建数据Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);//插入数据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(), Great20());if (it == v.end()){cout << "没有找到!" << endl;}else{cout << "找到了:name = " << it->m_name << " age = " << it->m_age << endl;}
}
int main()
{//test01();test02();system("pause");return 0;
}

3.adjacent_find

函数原型:

  • adjacent_find(iterator beg, iterator end);——// 查找相邻重复元素,返回相邻元素的第一个位置的迭代器;beg 开始迭代器;end 结束迭代器
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//adjacent_find——查找相邻重复元素
void test01()
{vector<int>v;v.push_back(1);v.push_back(5);v.push_back(3);v.push_back(9);v.push_back(6);v.push_back(6);v.push_back(8);v.push_back(3);vector<int>::iterator pos = adjacent_find(v.begin(), v.end());if (pos == v.end()){cout << "没有相邻重复元素!" << endl;}else{cout << "找到了相邻重复元素:" << *pos << endl;}
}
int main()
{test01();system("pause");return 0;
}

4.binary_search

函数原型:

  • bool binary_search(iterator beg, iterator end, value);——// 查找指定的元素,查到 返回true 否则false;注意: 在无序序列中不可用; beg 开始迭代器; end 结束迭代器;value 查找的元素
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//binary_search——查找容器中指定元素是否存在(有序序列)
void test01()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//v.push_back(2);    如果是无序序列,结果未知!//查找容器中是否有9元素//注意:容器必须是有序序列bool ret = binary_search(v.begin(), v.end(), 9);if (ret){cout << "找到了!" << endl;}else{cout << "没有找到!" << endl;}
}
int main()
{test01();system("pause");return 0;
}

注:二分查找法效率很高,但查找容器中元素必须为有序序列。

5.count

函数原型:

  • count(iterator beg, iterator end, value)——// 统计元素出现次数;beg 开始迭代器;end 结束迭代器; value 统计的元素
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
//count——查找算法
//查找内置数据类型
void test01()
{vector<int>v;v.push_back(20);v.push_back(50);v.push_back(90);v.push_back(40);v.push_back(50);v.push_back(80);v.push_back(50);int num = count(v.begin(), v.end(), 50);cout << "容器中5的个数为:" << num << endl;
}
//查找自定义数据类型
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}bool operator ==(const Person &p){if (p.m_age == this->m_age){return true;}else{return false;}}string m_name;int m_age;
};
void test02()
{vector<Person>v;//创建数据Person p1("aaa", 25);Person p2("bbb", 45);Person p3("ccc", 25);Person p4("ddd", 60);Person p5("eee", 25);Person p6("fff", 16);Person p7("ggg", 25);//导入数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);v.push_back(p6);v.push_back(p7);Person c("compare", 25);int num = count(v.begin(), v.end(), c);cout << "与compare年龄相同的人个数:" << num << endl;
}
int main()
{//test01();test02();system("pause");return 0;
}

注:统计自定义数据类型时需要配合重载operator==

6.count_if

函数原型:

  • count_if(iterator beg, iterator end, _Pred);——// 按条件统计元素出现次数;beg 开始迭代器;end 结束迭代器; _Pred 谓词
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<functional>
//count_if——条件查找
//查找内置数据类型
class Greater30
{
public:bool operator()(int val){return val > 30;}
};
void test01()
{vector<int>v;v.push_back(10);v.push_back(50);v.push_back(80);v.push_back(60);v.push_back(30);v.push_back(40);//查找大于30的数的个数int num = count_if(v.begin(), v.end(), Greater30());cout << "大于30的数的个数:" << num << endl;
}
//查找自定义数据类型
class Person
{
public:Person(string name, int age){this->m_name = name;this->m_age = age;}string m_name;int m_age;
};
class ageGreater18
{
public:bool operator()(Person& p){return p.m_age > 18;}
};
void test02()
{vector<Person>v;//创建数据Person p1("aaa", 15);Person p2("bbb", 45);Person p3("ddd", 18);Person p4("fff", 60);Person p5("jjj", 85);//导入数据v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);//查找年龄大于18的人的个数int num = count_if(v.begin(), v.end(), ageGreater18());cout << "年龄大于18的人数:" << num << endl;
}
int main()
{//test01();test02();system("pause");return 0;
}

 

相关文章:

  • kubeadm来搭建k8s集群。
  • C++构建简单静态库实例(cmakelist)
  • 【Yii2】数据库查询方法总结
  • 学习体系结构 - AArch64内存管理
  • HTML-基础知识-基本结构,注释,文档说明,字符编码(一)
  • 【Pytorch】学习记录分享8——PyTorch自然语言处理基础-词向量模型Word2Vec
  • 记录一下imx6ull linux 5.10.9多点电容触摸屏驱动报错问题解决方法
  • Python中matplotlib库的使用1
  • 《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》
  • 【面试题】HTTP 协议中 URI 和 URL 的区别
  • linux基于用户身份对资源访问进行控制的解析及过程
  • RabbitMQ 和 Kafka 对比
  • FPGA - 231227 - 5CSEMA5F31C6 - 电子万年历
  • GoLang学习之路,对Elasticsearch的使用,一文足以(包括泛型使用思想)(二)
  • redis,memcached,nginx网络组件,网络编程——reactor的应用
  • [Vue CLI 3] 配置解析之 css.extract
  • Asm.js的简单介绍
  • Mybatis初体验
  • vuex 学习笔记 01
  • 欢迎参加第二届中国游戏开发者大会
  • 记录一下第一次使用npm
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端代码风格自动化系列(二)之Commitlint
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 算法-图和图算法
  • 提醒我喝水chrome插件开发指南
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小程序开发之路(一)
  • 源码安装memcached和php memcache扩展
  • postgresql行列转换函数
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 昨天1024程序员节,我故意写了个死循环~
  • #HarmonyOS:基础语法
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)shell调试方法
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • .net 使用ajax控件后如何调用前端脚本
  • .NetCore部署微服务(二)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @Transactional 竟也能解决分布式事务?
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]
  • [20170705]diff比较执行结果的内容.txt
  • [bzoj2957]楼房重建
  • [C语言]——柔性数组
  • [go] 策略模式
  • [iOS]中字体样式设置 API
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup
  • [JavaScript]如何讓IE9, IE8, IE7, IE6關閉視窗時不彈出對話訊息
  • [JS]JavaScript 注释 输入输出语句