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

【C++中的STL】常用算法1——遍历算法和查找算法

常用算法1

  • 常用算法
    • 常用遍历算法
      • for_each
      • transform
    • 常用查找算法
      • find
      • find_if
      • adjacent_find
      • binary_search
      • count
      • count_if

常用算法

算法主要是由头文件<algorithm><functional><numeric>组成。
<algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等。
<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
<functional>定义了一些模板类用以声明函数对象。

常用遍历算法

1、for_each遍历容器
2、transform搬运容器到另一个容器中

for_each

for_each(iterator beg,interator end,_func);遍历算法,遍历容器元素,beg开始迭代器,end结束迭代器,_func函数或者函数对象

//普通函数
void p1(int val) {cout << val << "  ";
}
//仿函数
class p2 {
public:void operator()(int val) {cout << val << "  ";}
};
void test() {...//普通函数for_each(v.begin(), v.end(),p1);cout << endl;cout << "-----------------------------------------" << endl;//仿函数for_each(v.begin(), v.end(), p2());
}

在这里插入图片描述

transform

transform(iterator beg1,interator end1,interator beg2,_func);beg1源容器开始迭代器,end源容器结束迭代器,beg2目标容器开始迭代器,_func函数或者函数对象

//输出仿函数
class p1 {
public:void operator()(int val) {cout << val << "  ";}
};//加100仿函数
class p2 {
public:int operator()(int val) {return val+100;}
};
void test() {vector<int> v;v.push_back(12);v.push_back(32);v.push_back(57);v.push_back(22);v.push_back(65);vector<int>v1;v1.resize(v.size());//目标容器必须提前开辟空间transform(v.begin(), v.end(), v1.begin(),p2());for_each(v1.begin(), v1.end(), p1());
}

在这里插入图片描述

常用查找算法

1、find查找元素
2、find_if按条件查找元素
3、adjacent_find查找相邻重复元素
4、binary_search二分查找法
5、count统计元素个数
6、count_if按条件统计元素个数

find

查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
find(iterator beg,interator end,value);按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置,beg开始迭代器,end结束迭代器,value查找的元素

void test() {//内置数据类型vector<int> v;v.push_back(12);v.push_back(32);v.push_back(57);v.push_back(22);v.push_back(65);vector<int>::iterator ret = find(v.begin(), v.end(), 32);if (ret != v.end()) {cout << "找到" << endl;}else {cout << "没有找到" << endl;}//自定义类型vector<S> v1;S s1("Tom", 13);S s2("Ala", 32);S s3("Tony", 15);S s4("Mary", 18);S s5("Mola", 23);v1.push_back(s1);v1.push_back(s2);v1.push_back(s3);v1.push_back(s4);vector<S>::iterator ret1 = find(v1.begin(), v1.end(), s5);if (ret1 != v1.end()) {cout << "找到" << endl;}else {cout << "没有找到" << endl;}
}

find_if

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

void test() {//内置数据类型...vector<int>::iterator ret = find_if(v.begin(), v.end(), p1());if (ret != v.end()) {cout << "找到" << endl;}else {cout << "没有找到" << endl;}...vector<S>::iterator ret1 = find_if(v1.begin(), v1.end(), p2());if (ret1 != v1.end()) {cout << "找到" << endl;}else {cout << "没有找到" << endl;}
}

adjacent_find

查找相邻重复元素
adjacent_find(iterator beg,interator end);查找相邻重复元素,返回相邻元素的第一个位置的迭代器,beg开始迭代器,end结束迭代器

void test() {//内置数据类型vector<int> v;v.push_back(12);v.push_back(32);v.push_back(12);v.push_back(22);v.push_back(65);vector<int>::iterator ret = adjacent_find(v.begin(), v.end());if (ret != v.end()) {cout << "找到相邻的元素:"<<*ret << endl;}else {cout << "没有找到相邻的元素" << endl;}

binary_search

二分查找法,查找指定的元素,查到返回true,否则false
binary_search(iterator beg,interator end,value);无序序列中不可用,beg开始迭代器,end结束迭代器,value查找的元素

count

统计元素个数
count(iterator beg,interator end,value);统计元素出现次数,beg开始迭代器,end结束迭代器,value统计的元素

void test() {//内置数据类型vector<int> v;...v.push_back(50);...v.push_back(50);v.push_back(50);int ret = count(v.begin(), v.end(),1);cout <<"1的个数:" << ret << endl;vector<S> v1;...S s4("Mary", 18);S s5("Mola", 18);...int ret1 = count(v1.begin(), v1.end(), s5);cout << "年龄为18的个数:" << ret1 << endl;

count_if

按条件统计元素个数
count_if(iterator beg,interator end,_Pred);按条件统计元素出现次数,beg开始迭代器,end结束迭代器,_Pred谓词

	//内置数据类型vector<int> v;v.push_back(10);v.push_back(20);v.push_back(50);v.push_back(30);v.push_back(40);v.push_back(50);v.push_back(50);int ret = count_if(v.begin(), v.end(),p1());cout <<"大于等于40的个数:" << ret << endl;vector<S> v1;S s1("Tom", 13);S s2("Ala", 32);S s3("Tony", 15);S s4("Mary", 18);S s5("Mola", 18);v1.push_back(s1);v1.push_back(s2);v1.push_back(s3);v1.push_back(s4);v1.push_back(s5);int ret1 = count_if(v1.begin(), v1.end(), p2());cout << "年龄大于等于18的个数:" << ret1 << endl;

在这里插入图片描述

http://www.lryc.cn/news/289420.html

相关文章:

  • Jmeter性能测试: 基于JDK 21 安装 Jmeter 5.6.3
  • Linux命令-apropos命令(在 whatis 数据库中查找字符串)
  • 【算法】解决动态规划问题的通用步骤思路及示例算法:打家劫舍【动态规划】
  • 蓝桥杯之即约分数
  • Pointnet++改进优化器系列:全网首发Sophia优化器 |即插即用,实现有效涨点
  • 1.27回溯(中等)
  • sql管理工具archery简介
  • DEM高程地形瓦片数据Cesium使用教程
  • 3个精美的wordpress律师网站模板
  • 在windows环境下安装hadoop
  • 大数据分析组件Hive-集合数据结构
  • 单核QPS近6000S,陌陌基于OceanBase的持久化缓存探索与实践
  • 关于css 的基础试题
  • Keil-C语言小总结
  • react的withRouter高阶组件:
  • 小程序 样式 WXSS
  • LLM之RAG实战(二十一)| 使用LlamaIndex的Text2SQL和RAG的功能分析产品评论
  • Scikit-learn (sklearn)速通 -【莫凡Python学习笔记】
  • 支持向量机(SVM)详解
  • huggingface学习|云服务器部署Grounded-Segment-Anything:bug总会一个一个一个一个又一个的解决的
  • 【最佳实践】Go 组合模式对业务解耦
  • arm 汇编调用C
  • Vue3+Vite使用Puppeteer进行SEO优化(SSR+Meta)
  • uni-app学习与快速上手
  • orchestrator介绍3.4 web API 的使用
  • 市场复盘总结 20240122
  • TCP 三次握手 四次挥手以及滑动窗口
  • yum指令——Linux的软件包管理器
  • 【WPF.NET开发】​规划WPF应用程序性能
  • Ubuntu22.04报错:ValueError: the symlink /usr/bin/python3 does not point to ...