c++ stl 遍历算法和查找算法
概述:
算法主要由头文件<algorithm> <functional> <numeric> 提供
<algorithm> 是所有 STL 头文件中最大的一个,提供了超过 90 个支持各种各样算法的函数,包括排序、合并、搜索、去重、分解、遍历、数值交换、拷贝和替换、插入和删除等
<functional> 定义了一些模板类,用以声明函数对象。函数对象(function object)是一个重载了函数调用操作符(operator())的类。
<numeric> 定义了执行算术运算的一些模板函数。
1. 常用遍历算法
学习目标:
掌握常用的遍历算法
算法简介:
for_each // 遍历容器
transform // 搬运容器到另一个容器中
1.1 for_each
函数原型
for_each(iterator beg, iterator end, _func)
beg 起始迭代器
end 结束迭代器
_func 函数或者函数对象
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// 普通函数
void print01(int val){cout << val << " ";
}// 防函数
class PrintData{
public:void operator()(int val){cout << val << " ";}
};void test01()
{// 逻辑非vector<int> v;for(int i = 0; i < 10; i++){v.push_back(i);}for_each(v.begin(), v.end(), print01);cout << endl;// 防函数for_each(v.begin(), v.end(), PrintData());cout << endl;// Lambda 表达式for_each(v.begin(), v.end(), [](int val){cout << val << " ";});cout << endl;
}int main(int argc, char const *argv[])
{test01();return 0;
}
1.2 transform
概念:
搬运容器到另一个容器中
函数原型:
transform(iterator beg1, iterator end1, iteartor beg2, _fuc);
beg1 原容器开始迭代器
end1 原容器结束迭代器
beg2 目标起始迭代器
_fuc 函数或者函数对象
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// stL 常用算法 transform// transform(iterator beg1, iterator end1, iteartor beg2, _fuc); class Transform{
public:int operator()(int val){// 将数字翻倍return val * 2;}};void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int> v2;v2.resize(v.size()); // 目标容器需要提前开辟空间transform(v.begin(), v.end(), v2.begin(),Transform());// 遍历容器for_each(v2.begin(), v2.end(), [](int val){cout << val << " ";});
}int main(int argc, char const *argv[])
{test01();return 0;
}
2. 常用查找算法
算法简介
find // 查找元素
find_if // 按条件查找元素
adjacent_find // 查找相邻重复元素
binary_search // 二分查找
count // 统计元素个数
count_if // 按条件统计元素个数
2.1 find
查找指定元素,找到返回指定元素的迭代器,找不到返回end()
函数原型
find(begin, end, val)
begin 开始迭代器
end 结束迭代器
val 查找的元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// stL 常用查找算法// find // 查找内置的数据类型
void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}// 查找容器中是否有6vector<int>::iterator it = find(v.begin(), v.end(), 6);if(it == v.end()){cout << "没有找到" << endl;}else{cout << "找到元素为:" << *it << endl;}}// 查找自定义数据类型
class Person{
public:Person(string name, int age):m_Name(name),m_Age(age){}string m_Name;int m_Age;// 重载==bool operator==(const Person &p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}
};void test02(){vector<Person> v;Person p1("西施", 18);Person p2("王昭君", 19);Person p3("杨玉环", 17);Person p4("貂蝉", 16);Person p5("小乔", 15);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person p("貂蝉", 16);vector<Person>::iterator it = find(v.begin(), v.end(), p);if(it == v.end()){cout << "没有找到" << endl;}else{cout << "找到元素为:" << it->m_Name << " " << it->m_Age << endl;}
}int main(int argc, char const *argv[])
{test02();return 0;
}
查找自定义数据,必须重载==
2.2 find_if
功能描述:
按条件查找元素
函数原型
find_if(iterator beg, iterator end, _Pred)
功能描述:按条件查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
注意:_Pred为谓词(返回bool类型的防函数) 或 函数
beg 开始迭代器
end 结束迭代器
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// stL 常用查找算法// find_if// 查找内置的数据类型
void test01()
{vector<int> v;for (int i = 0; i < 10; i++){v.push_back(i);}// 用lambda表达式实现 查找容器中是有大于6 vector<int>::iterator it = find_if(v.begin(), v.end(), [&](int val){return val > 6;});if(it == v.end()){cout << "没有找到" << endl;}else{cout << "找到元素为:" << *it << endl;}}// 查找自定义数据类型
class Person{
public:Person(string name, int age):m_Name(name),m_Age(age){}string m_Name;int m_Age;bool operator==(const Person &p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}
};class findPerson{
public:bool operator()(const Person &p){// 查找年龄大于17的if (p.m_Age > 17){return true;}else{return false;}}
};void test02(){vector<Person> v;Person p1("西施", 18);Person p2("王昭君", 19);Person p3("杨玉环", 17);Person p4("貂蝉", 16);Person p5("小乔", 15);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person p("貂蝉", 16);vector<Person>::iterator it = find_if(v.begin(), v.end(), findPerson());if(it == v.end()){cout << "没有找到" << endl;}else{cout << "找到元素为:" << it->m_Name << " " << it->m_Age << endl;}
}int main(int argc, char const *argv[])
{test02();return 0;
}
2.3 adjacent_find
功能描述:
查找相邻重复元素
函数原型:
adjacent_find(iterator first, iterator last, binary_predicate pred);
功能描述:
查找相邻重复元素,返回相邻元素的第一个位置的迭代器
参数说明:
first:开始迭代器
last:结束迭代器
pred:二元谓词
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// stL 常用查找算法// adjacent_find// 查找内置的数据类型
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);v.push_back(30);v.push_back(50);vector<int>::iterator it = adjacent_find(v.begin(), v.end());if (it == v.end()){cout << "找不到" << endl;}else{cout << "找到相邻重复元素为:" << *it << endl;}}// 查找自定义数据类型
class Person{
public:Person(string name, int age):m_Name(name),m_Age(age){}string m_Name;int m_Age;bool operator==(const Person &p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}
};class findPerson{
public:bool operator()(const Person &p , const Person &p2){// 查找年龄相同的if (p.m_Age == p2.m_Age){return true;}else{return false;}}
};// 查找自定义数据类型
void test02(){vector<Person> v;Person p1("西施", 18);Person p2("王昭君", 19);Person p3("杨玉环", 19);Person p4("貂蝉", 16);Person p5("小乔", 15);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);vector<Person>::iterator it = adjacent_find(v.begin(), v.end(), findPerson());if(it == v.end()){cout << "没有找到" << endl;}else{cout << "找到元素为:" << it->m_Name << " " << it->m_Age << endl;}
}int main(int argc, char const *argv[])
{test02();return 0;
}
2.4 binary_search
查找指定元素是否存在
函数原型
bool binary_search(InputIterator first, InputIterator last, const T& val);
功能描述:
查找到val在[first, last)区间中,则返回true,否则返回false。
注意:在无序序列中不可用。
beg 开始迭代器
end 结束迭代器
val 查找的元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// binary_searchvoid test01()
{vector<int> v;for(int i = 0; i < 10; i++){v.push_back(i);}bool result = binary_search(v.begin(), v.end(), 10);if (result){cout << "find" << endl;}else{cout << "not find" << endl;}}int main(int argc, char const *argv[])
{test01();return 0;
}
2.5 count
功能描述:
统计元素个数
函数原型
count(InputIterator first, InputIterator last, const T& val);
功能描述:
统计出元素次数
beg 开始迭代器
end 结束迭代器
val 查找的元素
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// count// 统计内置数据类型
void test01()
{vector<int> v;for(int i = 0; i < 10; i++){v.push_back(i);}v.push_back(10);v.push_back(10);int result = count(v.begin(), v.end(), 10);cout << result << endl;}// 统计自定义数据类型
class Person{
public:Person(string name, int age):m_Name(name), m_Age(age){}bool operator==(const Person &p){if(this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};void test02(){vector<Person> v;v.push_back(Person("西施", 18));v.push_back(Person("小龙女", 18));v.push_back(Person("貂蝉", 20));v.push_back(Person("杨玉环", 18));v.push_back(Person("王昭君", 19));Person p("小乔",18);int result = count(v.begin(), v.end(), p);cout << "和小乔年龄相同的人有" << result << "个";
}int main(int argc, char const *argv[])
{test02();return 0;
}
总结:统计自定义类型的时候,需要重载 operator==
2.6 count_if
功能描述: 按照条件在容器中统计元素个数
函数原型:
count_if(iterator beg, iterator end, _Pred)
beg 开始迭代器
end 结束迭代器
_Pred 谓词
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <functional>
#include <algorithm>
using namespace std;#define CEHUA 0
#define MEISHU 1
#define YANFA 2// count_ifclass Greater{
public:Greater(int val):m_Val(val){}bool operator()(int val){return val > m_Val;}int m_Val; // 可以改变条件
};// 统计内置数据类型
void test01()
{vector<int> v;for(int i = 0; i < 10; i++){v.push_back(i);}v.push_back(10);v.push_back(10);// 统计大于8的数字有多少个int result = count_if(v.begin(), v.end(), Greater(8));cout << result << endl;
}// 统计自定义数据类型
class Person{
public:Person(string name, int age):m_Name(name), m_Age(age){}bool operator==(const Person &p){if(this->m_Age == p.m_Age){return true;}else{return false;}}string m_Name;int m_Age;
};class CountPerson{
public:CountPerson(int age):m_Age(age){}bool operator()(const Person &p){return p.m_Age > m_Age;}int m_Age;
};void test02(){vector<Person> v;v.push_back(Person("西施", 18));v.push_back(Person("小龙女", 18));v.push_back(Person("貂蝉", 20));v.push_back(Person("杨玉环", 18));v.push_back(Person("王昭君", 19));Person p("小乔",18);v.push_back(p);int result = count_if(v.begin(), v.end(), CountPerson(17));cout << "年龄大于17的美女: " << result << "个";
}int main(int argc, char const *argv[])
{test02();return 0;
}相关文章:
c++ stl 遍历算法和查找算法
概述: 算法主要由头文件<algorithm> <functional> <numeric> 提供 <algorithm> 是所有 STL 头文件中最大的一个,提供了超过 90 个支持各种各样算法的函数,包括排序、合并、搜索、去重、分解、遍历、数值交换、拷贝和…...
【Envi遥感图像处理】008:波段(批量)分离与波段合成
文章目录 一、波段分离提取1. 提取单个波段2. 批量提取单个波段二、波段合成相关阅读:【ArcGIS微课1000例】0058:波段合成(CompositeBands)工具的使用 一、波段分离提取 1. 提取单个波段...
线程创建与管理 - 创建线程、线程同步(C++)
前言 在现代软件开发中,线程的创建和管理是并发编程的核心内容之一。通过合理地创建和管理线程,可以有效提高程序的响应速度和资源利用率。本文将详细讲解如何在C中创建线程,并探讨几种常见的线程同步机制。我们假设读者具备一定的C基础&…...
【C语言篇】“三子棋”
一、游戏介绍 三子棋,英文名为 Tic - Tac - Toe,是一款简单而经典的棋类游戏。游戏在一个 33 的棋盘上进行,两名玩家轮流在棋盘的空位上放置自己的棋子(通常用 * 和 # 表示),率先在横、竖或斜方向上连成三个…...
安培定律应用于 BH 曲线上的工作点
在本篇博文中,我将展示如何应用安培定律来确定磁芯包裹的导体必须承载多少电流才能从 BH 值工作点获得 B 值,该工作点对应于磁芯材料中的最大 B 值。我在 BH 曲线上使用两个工作点,一个在线性区域,另一个在饱和区域。 安培定律 H…...
深度求索DeepSeek横空出世
真正的强者从来不是无所不能,而是尽我所能。多少有关输赢胜负的缠斗,都是直面本心的搏击。所有令人骄傲振奋的突破和成就,看似云淡风轻寥寥数语,背后都是数不尽的焚膏继晷、汗流浃背。每一次何去何从的困惑,都可能通向…...
【CSS】什么是响应式设计?响应式设计的基本原理,怎么做
在当今多设备、多屏幕尺寸的时代,网页设计面临着前所未有的挑战。传统的固定布局已无法满足用户在不同设备上浏览网页的需求,响应式设计(Responsive Web Design)应运而生,成为网页设计的趋势和标准。本文将深入探讨响应…...
后盾人JS--继承
继承是原型的继承 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </hea…...
提升开发效率:IDE使用技巧与插件推荐
在软件开发过程中,选择一个合适的集成开发环境(IDE)并掌握其使用技巧,可以显著提高开发效率。本文将分享一些常用的IDE使用技巧,并推荐几款实用的插件,帮助开发者更好地利用IDE进行开发。 一、IDE使用技巧…...
开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B与vllm实现推理加速的正确姿势(一)
一、前言 在当今人工智能技术迅猛发展的时代,各类人工智能模型如雨后春笋般不断涌现,其性能的优劣直接影响着应用的广度与深度。从自然语言处理到计算机视觉,从智能安防到医疗诊断,AI 模型广泛应用于各个领域,人们对其准确性、稳定性和高效性的期望也与日俱增。 在此背景下…...
小书包:让阅读更美的二次开发之作
小书包是在一款知名阅读软件的基础上进行二次开发的产品。在保留原有软件的基本功能和用户体验的同时,对其界面和视觉效果进行了精心美化,让阅读体验更加舒适和愉悦。 内置了171条书源,虽然数量不算多,但都是作者精挑细选出来的&a…...
MySQL 插入数据指南
MySQL 插入数据指南 引言 MySQL 是一款广泛使用的开源关系数据库管理系统,被广泛应用于各种规模的组织中。在数据库管理中,数据的插入是基础操作之一。本文将详细介绍如何在 MySQL 中插入数据,包括插入单条记录和多条记录,以及一…...
防火墙安全策略实验
一、拓扑图 需求 Cloud云: 二、防火墙配置 初始化防火墙 Username:admin Password:***** The password needs to be changed. Change now? [Y/N]: y Please enter old password: Admin123 Please enter new password: admin123 Please confirm new password: …...
【Redis】主从模式,哨兵,集群
主从复制 单点问题: 在分布式系统中,如果某个服务器程序,只有一个节点(也就是一个物理服务器)来部署这个服务器程序的话,那么可能会出现以下问题: 1.可用性问题:如果这个机器挂了…...
互联网行业常用12个数据分析指标和八大模型
本文目录 前言 一、互联网线上业务数据分析的12个指标 1. 用户数据(4个) (1) 存量(DAU/MAU) (2) 新增用户 (3) 健康程度(留存率) (4) 渠道来源 2. 用户行为数据(4个) (1) 次数/频率…...
多模块协同信息安全管理平台
1.产品介绍 产品名称 【SecureMOS - 多模块协同信息安全管理平台】 主要功能: [功能1] 模块化架构设计与集成 具体作用与使用方式: 通过模块化的设计,将信息安全系统分解为多个独立且可扩展的组件,便于快速部署和维护。需求满足与问题解…...
基于RK3588/RK3576+MCU STM32+AI的储能电站电池簇管理系统设计与实现
伴随近年来新型储能技术的高质量规模化发展,储能电站作为新能源领域的重要载体, 旨在配合逐步迈进智能电网时代,满足电力系统能源结构与分布的创新升级,给予相应规模 电池管理系统的设计与实现以新的挑战。同时,电子系…...
使用LightGlue进行图像配准并提取图像重叠区域
发表日期:2023年6月23日 项目地址:https://github.com/cvg/LightGlue https://github.com/cvg/glue-factory/ LightGlue是一个在精度上媲美Superglue,但在速度上比Superglue快一倍的模型。通过博主实测,LightGlue的配准效果比Su…...
DeepSeek-R1:开源机器人智能控制系统的革命性突破
目录 引言 一、DeepSeek-R1 的概述 1.1 什么是 DeepSeek-R1? 1.2 DeepSeek-R1 的定位 二、DeepSeek-R1 的核心特性 2.1 实时控制能力 2.2 多传感器融合 2.3 路径规划与导航 2.4 人工智能集成 2.5 开源与模块化设计 2.6 跨平台支持 三、DeepSeek-R1 的技术…...
第二十二章 MySQL锁之全局锁
目录 一、锁概述 二、全局锁概念 三、全局锁使用 四、全局锁特点 五、不加锁一致性数据备份 5.1. 实现方式 5.2. 优点和缺点 一、锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O&#x…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
