5.2 常用查找算法

学习目标:

  • 掌握常用的查找算法

算法简介:

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

5.2.1 find

功能描述:

  • 查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器

函数原型:

  • find(iterator beg, iterator end, value);

    • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素

示例:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;//查找 findclass Person {public:string m_name;int m_age;Person(string name, int age) {this->m_name = name;this->m_age = age;}//重写==操作符,为了底层 find 如何对比//可以写入一个元素查找,或者直接输入自定义类型查找//看个人需求bool operator==(const string name) {return this->m_name == name;}};//内置数据类型查找
void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);v.push_back(50);//利用迭代器接收查找到的数据vector<int>::iterator it = find(v.begin(), v.end(), 40);if (it != v.end()) {cout << "找到了:" << *it << endl;}else {cout << "没有找到" << endl;}
}//自定义数据类型查找
void test02() {vector<Person> v;//创建数据Person p1("张三", 10);Person p2("李四", 20);Person p3("王五", 30);Person p4("赵六", 10);//加入容器v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);//查找//若不重写,find 不知道比较哪一个元素vector<Person>::iterator it = find(v.begin(), v.end(), "李四");if (it != v.end()) {cout << "找到了,姓名:" << (*it).m_name << " 年龄:" << (*it).m_age << endl;}else {cout << "没找到" << endl;}
}//主函数
int main() {test01();test02();system("pause");return 0;
}

总结:利用find可以在容器中找到指定的元素,返回值是迭代器

5.2.2 find_if

功能描述:

  • 按条件查找元素

函数原型:

  • find_if(iterator beg, iterator end, _Pred);

    • 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
    • beg 开始迭代器
    • end 结束迭代器
    • _Pred 函数或者谓词(返回bool 类型的仿函数)

示例:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;//按条件查找元素 find_if//自定义数据类型
class Person {public:string m_name;int m_age;Person(string name, int age) {this->m_name = name;this->m_age = age;}
};//写一个谓词(内置数据类型判断)
class GreatThirty {public:bool operator()(int val) {return val > 30;}
};//换一种写法,用函数(自定义数据类型判断)
bool DIY_GreatTwenty(const Person& p) {return p.m_age > 20;
}//内置数据类型
void test01() {vector<int> v;v.push_back(10);v.push_back(50);v.push_back(40);v.push_back(30);vector<int>::iterator it = find_if(v.begin(), v.end(), GreatThirty());if (it != v.end()) {cout << "找到了 大于30 的元素为:" << (*it) << endl;}else {cout << "没有找到" << endl;}
}//自定义数据类型
void test02() {vector<Person> v;Person p1("张三", 10);Person p2("李四", 20);Person p3("王五", 30);Person p4("赵六", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator it = find_if(v.begin(), v.end(), DIY_GreatTwenty);if (it != v.end()) {cout << "找到了 大于20 的元素,姓名为:" << (*it).m_name << " 年龄为:" << (*it).m_age << endl;}else {cout << "没有找到" << endl;}
}//主函数
int main() {test01();test02();system("pause");return 0;
}

5.2.3 adjacent_find

功能描述:

  • 查找相邻重复元素

函数原型:

  • adjacent_find(iterator beg, iterator end);

    • 查找相邻重复元素,返回相邻元素的第一个位置的迭代器
    • beg 开始迭代器
    • end 结束迭代器

示例:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;//查找相邻重复元素 adjacent_find
void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(10);v.push_back(30);v.push_back(30);v.push_back(40);vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it != v.end()) {cout << "找到了相邻重复元素:" << (*it) << endl;}else {cout << "没有找到" << endl;}
}//主函数
int main() {test01();system("pause");return 0;
}

5.2.4 binary_search

功能描述:

  • 查找指定元素是否存在

函数原型:

  • bool binary_search(iterator beg, iterator end, value);

    • 查找指定元素,查到 返回true,否则false
    • 注意:在无序序列中不可用!,而且只能用于升序序列例如set容器
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素

示例:

#include<iostream>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;//二分查找指定元素是否存在 binary_search
void test01() {set<int> s;s.insert(20);s.insert(50);s.insert(30);s.insert(10);s.insert(40);if (binary_search(s.begin(), s.end(),50)) {cout << "在 set 容器中找到了50" << endl;}else {cout << "在 set 容器中没有找到" << endl;}//试用 binary_search 查找无序容器vector<int> v;v.push_back(50);v.push_back(40);v.push_back(30);v.push_back(20);if (binary_search(v.begin(), v.end(), 50)) {cout << "在 vector 容器中找到了50" << endl;}else {cout << "在 vector 容器中没有找到" << endl;}
}//主函数
int main() {test01();system("pause");return 0;
}

总结:二分查找法效率很高,值得注意的是查找的容器中元素必须是有序序列

5.2.5 count

功能描述:

  • 统计元素个数

函数原型:

  • count(iterator beg, iterator end, value);

    • 统计元素出现次数
    • beg 开始迭代器
    • end 结束迭代器
    • value 查找的元素

示例:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;//统计元素个数 count//自定义数据类型
class Person {public:string m_name;int m_age;Person(string name, int age) {this->m_name = name;this->m_age = age;}//重载==符号,方便元素查找bool operator==(const int val) {return this->m_age == val;}
};//内置数据类型
void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(10);v.push_back(40);v.push_back(10);int sum = count(v.begin(), v.end(), 10);cout << "容器中10的个数为:" << sum << endl;
}//自定义数据类型
void test02() {vector<Person> v;Person p1("张三", 10);Person p2("李四", 20);Person p3("王五", 30);Person p4("赵六", 20);Person p5("贾七", 20);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);cout << "年龄是20岁的人的个数是:" << count(v.begin(), v.end(), 20) << endl;
}//主函数
int main() {test01();test02();system("pause");return 0;
}

总结:统计自定义数据类型时候,需要配合operator==

5.2.6 count_if

功能描述:

  • 按条件统计元素个数

函数原型:

  • count_if(iterator beg, iterator end, _Pred);

    • 按条件统计元素出现次数
    • beg 开始迭代器
    • end 结束迭代器
    • _Pred 谓词

示例:

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;//按条件统计元素个数//谓词(寻找小于30)
class LessThirty {public:bool operator()(int val) {return val < 30;}
};//统计内置数据类型
void test01() {vector<int> v;v.push_back(10);v.push_back(20);v.push_back(20);v.push_back(30);v.push_back(40);int sum = count_if(v.begin(), v.end(), LessThirty());cout << "小于30的数有 " << sum << " 个" << endl;
}//主函数
int main() {test01();system("pause");return 0;
}

STL算法——常用查找算法(find、find_if、adjacent_find、binary_search、count、count_if)相关推荐

  1. C++ STL 常用查找算法

    C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...

  2. C++STL常用查找算法

    C++STL常用查找算法 学习目标 算法简介 find 功能描述 函数原型 示例 总结 find_if 功能描述 函数原型 示例 总结 adjacent_find 功能描述 函数原型 示例 总结 bi ...

  3. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  4. 第九层(11):STL之常用遍历算法

    文章目录 前情回顾 常用算法 常用遍历算法 for_each transform 下一座石碑

  5. c++中STL的常用算法---2(遍历算法,查找算法)

    算法概述 算法主要由头文件组成 是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等 体积很小,只包括在几个序列容器上进行的简单运算的模板函数 定 ...

  6. C++ 常用查找算法

    #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include <algorithm> using namespace ...

  7. C++实现常用查找算法

    在日常编程和面试中,查找算法和排序算法需要非常熟练.本文用C++语言的语法来写常用的查找算法:顺序查找,二分查找, 一.顺序查找 1.1基本思想(有序无序皆可以) 1 从表中的第一个元素开始,依次与关 ...

  8. C++常用查找算法总结(一)

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找,字段的查找,等等. 1.查找算法总结 (1). 最容易理解的查找算法,顺序查找法 说明:顺 ...

  9. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

最新文章

  1. 算术运算符_加号的多种用法
  2. Web前端开发笔记——第三章 CSS语言 第二节 CSS选择器
  3. XCode 快捷键, MAC 快捷键
  4. Django框架—富文本编辑器
  5. Python自动化之列表
  6. 五个角度,来梳理下产品经理的分类和职业发展方向
  7. 中国人工智能学会最高荣誉CAAI Fellow出炉,首批53位大牛,姚期智谭铁牛等入选
  8. 扩展BSGS-传送门
  9. [TimLinux] JavaScript AJAX接收到的数据转换为JSON格式
  10. mysql dba环境验收_面对一个全新的环境,作为一个Mysql DBA,首先应该了解什么?
  11. 饥荒steam联机版服务器无响应,《饥荒:联机版》服务器卡顿原因分析及解决教程...
  12. 本地KMS虚拟服务器,搭建kms本地服务器
  13. 文电通:助力企业入局“无纸化办公”!
  14. win10计算机加域步骤,win10加域
  15. 大写字母转换成小写字母
  16. Linux(Debian11)安装百度网盘
  17. C# 调用外部exe程序,出现已停止工作
  18. tensorflow--tf实现矩阵乘法和加法
  19. oracle mysql substr_Oracle数据库中substr()函数简介说明
  20. ArchiCAD与Revit深度对比

热门文章

  1. 待就业六人组 团队团队展示
  2. 如何破解网页端已保存的用户名和密码
  3. nginx—status的使用
  4. 常见随机过程(一)(备份草稿)
  5. 如何在mac中使用jad命令
  6. HTML基础入门第一篇
  7. 培养孩子意志力的五种方法
  8. 腾讯会员如何关闭手机号自动续费
  9. 思科设备中DHCP 服务的配置
  10. 华为数据分类管理框架及数据治理方法