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

【STL——常用遍历与查找算法】

引入

算法主要由头文件< algorithm>、< functional>、< numeric>组成。

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

常用遍历算法

for_each //遍历容器
transform //搬运容器到另一个容器中

注意:之前的方法都是通过对象引出来的,而现在这些都是直接调用的,不需要像m.insert()这样引出来。

for_each

for_each(iterator beg, iterator end, _func);
括号内容包括:遍历的开始迭代器、结束迭代器、函数或函数对象(对迭代器范围内每个元素的操作逻辑),范围依旧是[begin,end)。

  • 头文件
#pragma once
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>//普通函数
void print01(int val);//仿函数
class print02 {
public:void operator()(int val);
};void test();
  • 源文件
#include"myFunc.h"void print01(int val) {cout << val<<" ";
}
//重载了圆括号运算符,使得print02类的对象可以像函数一样被调用
void print02::operator()(int val) {cout << val << " " ;
}void test() {  vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}cout << "原函数:" << endl;for_each(v.begin(), v.end(), print01);cout << endl;cout << "仿函数:" << endl;for_each(v.begin(), v.end(), print02());
}
transform

功能描述:搬运容器到另一个容器中。

transform(iterator beg1, iterator end1, iterator beg2, _func);
将源容器从beg1到end1的内容搬到beg2中,并对每个范围内的对象进行_func操作。

  • 定义类
class Transform {
public:int operator()(int val) {return val + 100;}
};class Myprint{
public:void operator()(int val) {cout << val << " ";}
};
  • 功能实现
void test() {  vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> target;target.resize(v.size()); //目标容器需要提前开辟空间transform(v.begin(), v.end(), target.begin(),Transform());for_each(target.begin(), target.end(), Myprint());
}

常用查找算法

在这里插入图片描述

find

功能描述:查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
函数原型:

find(iterator beg, iterator end, value);

查找[beg,end)位置上是否出现了value,若出现就返回出现位置的迭代器,未出现就返回结束迭代器end()。

void test() {  vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> ::iterator it=find(v.begin(),v.end(),6);if (it == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *it << endl;
}
find_if

功能描述:按条件查找元素
函数原型:

find_if(iterator beg, iterator end, _Pred);
_Pred返回bool类型的仿函数,条件就是_Pred里面的返回标准。

  • 定义类
class GreaterFive {
public:bool operator()(int val) {return val == 5;}
};
  • 功能实现
void test() {  vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}vector<int> ::iterator it=find_if(v.begin(),v.end(),GreaterFive());if (it == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *it << endl;
}
adjacent_find

功能描述:查找相邻重复元素
函数原型:

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

void test() {  vector<int> v = {0,2,2,4,6,6,8};vector<int> ::iterator pos = adjacent_find(v.begin(), v.end());if (pos == v.end()) {cout << "未找到" << endl;}else cout << "找到了" << *pos << endl; //输出第一组重复元素的首个元素
}
binary_search

二分查找功能描述:查找指定元素是否存在(必须是有序数列)
函数原型:

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

  • 功能实现
void test() {  vector <int>v;for (int i = 0; i < 10; i++) {v.push_back(i);}
bool ret= binary_search(v.begin(), v.end(), 6);
if (!ret) {cout << "未找到" << endl;
}
else cout << "找到了";
}
cout

功能描述:统计元素个数
函数原型:

count(iterator beg,iterator end, value);

void test() {vector <int>v = { 1,6,7,4,6,9,7,8 };int num = count(v.begin(), v.end(), 6);cout << "6的个数为:" << num;
}
count_if

功能描述:按条件统计元素个数
函数原型:

count_if(iterator beg, iterator end, _Pred);

_Pred内部的语句就作为判断的条件。

void test() {vector <int>v = { 9,12,31,44,89,1,5 };int num = count_if(v.begin(), v.end(), Greater10());cout << "大于10的数的个数为:" << num;
}
http://www.dtcms.com/a/585233.html

相关文章:

  • 牛客网华为在线编程题
  • 29网站建设全部400网站总机 阿里云
  • 第四章 依赖项属性
  • wpf 结合 HALCON 编程 学习知识点列表有哪些?如何学习?
  • 学习C#调用OpenXml操作word文档的基本用法(5:Style类分析-3)
  • 系统运维Day03_FTP与磁盘挂载
  • 嘉兴网站备案去哪里优化网站是什么意思
  • SQL笔试题(2)
  • MATLAB/Simulink三机九节点
  • JVM 内存结构与 GC 调优全景图
  • 4.3.5【2024统考真题】
  • 如何进行MSSQL提权?sp_oacreate、sp_oamethod和沙盒提权以及xp_regwrighte提权
  • AI大模型开发架构设计(23)——LangChain技术架构和关键技术深度剖析
  • JavaScript 中的 void 关键字详解
  • 智能演示时代:8款免费AI PPT生成工具全面评测
  • 实验室建设网站网站开发公司经营范围
  • 怎样做能直接上传微信的视频网站钢结构招聘网最新招聘信息
  • 什么是缓存
  • 电力设备多模态数据融合与自适应阈值在线状态评估
  • 顺序表vector--------练习题8题解
  • 百度C++实习生面试题深度解析
  • rnn lstm transformer mamba
  • 卷积神经网络(CNN)全面解析
  • 50_AI智能体运维部署之集成LangSmith实现全链路追踪:AI系统的可观测性实践
  • Java 9 + 模块化系统实战:从 Jar 地狱到模块解耦的架构升级​
  • 及时通讯桌面端应用基vue+GO
  • 三个常听到的消息/中间件MQTT RabbitMQ Kafka
  • QML学习笔记(五十四)QML与C++交互:数据转换——QVariantList与QVariantMap
  • Linux的基础IO流
  • RabbitMQ死信交换机与延迟队列:原理、实现与最佳实践