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…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...