【C++】 STL -- 算法(二)

【C++】 STL – 算法(二)


文章目录

  • 【C++】 STL -- 算法(二)
  • 前言
  • 一、常用遍历算法
  • 二、常用查找算法
  • 三、常用排序算法
  • 四、常用拷贝和替换算法
  • 五、常用算数生成算法
  • 六、常用集合算法
  • 总结


前言

本片文章将讲到常用遍历算法,常用查找算法,常用排序算法,常用拷贝和替换算法,常用算数生成算法,常用集合算法。


一、常用遍历算法

for_each用于遍历
//有返回值的
for_each可以绑定参数输出

class MyPrint
{
public:void operator()(int val){cout << val << endl;m_Count++;}int m_Count = 0;
};//for_each  用于遍历
//有返回值的
void test01()
{vector<int>v;for (int i = 0; i < 10;i++){v.push_back(i);}MyPrint print = for_each(v.begin(), v.end(), MyPrint());cout << "print.count = " << print.m_Count << endl;}//for_each可以绑定参数输出
class MyPrint2 :public binary_function<int,int,void>
{
public:void operator()(int val , int start) const{cout << val << endl;}};void test02()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}for_each(v.begin(), v.end(),  bind2nd( MyPrint2(), 1000));}

transform算法 将指定容器区间元素搬运到另一容器中

class MyTransform
{
public:int operator()(int val){	return val + 10000;}
};
void test03()
{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(), MyTransform());for_each(v2.begin(), v2.end(), [](int val){cout << val << " "; });}

二、常用查找算法

find算法 查找元素
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value 查找的元素
@return 返回查找元素的位置
find_if算法 条件查找
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param callback 回调函数或者谓词(返回bool类型的函数对象)
@return bool 查找返回true 否则false

void test01()
{vector<int>v;for (int i = 0; i < 10;i++){v.push_back(i);}vector<int>::iterator pos = find(v.begin(), v.end(), 5);if (pos != v.end()){cout << "找到了元素:" << *pos << endl;}else{cout << "未找到" << endl;}
}
class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}bool operator==(const Person & p){return this->m_Name == p.m_Name && this->m_Age == p.m_Age;}string m_Name;int m_Age;
};void test02()
{vector<Person> v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator pos = find(v.begin(), v.end(), p2);if (pos != v.end()){cout << "找到了元素  姓名: " << (*pos).m_Name << " 年龄: " << (*pos).m_Age << endl;}}class MyComparePerson :public binary_function< Person *, Person *, bool>
{
public:bool operator()(  Person * p1 ,  Person *p2 ) const{return p1->m_Name == p2->m_Name  && p1->m_Age == p2->m_Age; }
};void test03()
{vector<Person *> v;Person p1("aaa", 10);Person p2("bbb", 20);Person p3("ccc", 30);Person p4("ddd", 40);v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);Person * p = new Person("bbb", 20);vector<Person *>::iterator pos = find_if(v.begin(), v.end(), bind2nd( MyComparePerson() ,p)  );if (pos != v.end()){cout << "找到了元素--- 姓名: " << (*pos)->m_Name << " 年龄: " << (*pos)->m_Age << endl;}else{cout << "未找到" << endl;}
}

adjacent_find算法 查找相邻重复元素

void test04()
{vector<int>v;v.push_back(3);v.push_back(2);v.push_back(300);v.push_back(300);v.push_back(6);v.push_back(3);vector<int>::iterator ret = adjacent_find(v.begin(), v.end());if (ret != v.end()){cout << "找到了相邻的重复元素: " << *ret << endl;}else{cout << "未找到" << endl;}}

binary_search算法 二分查找法
注意: 在无序序列中不可用

void test05()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//v.push_back(4);  必须是有序序列,如果无效 结果未知bool ret=binary_search(v.begin(), v.end(), 2);if (ret){cout << "查到了数据2" << endl;}else{cout << "未找到数据2" << endl;}}

count算法 统计元素出现次数
@param beg 容器开始迭代器
@param end 容器结束迭代器
@param value回调函数或者谓词(返回bool类型的函数对象)
@return int返回元素个数

class GreaterThan3
{
public:bool operator()(int val){return val >= 3;}
};void test06()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}v.push_back(3);v.push_back(3);v.push_back(3);int num = count(v.begin(), v.end(), 3);cout << "3的个数为: " << num << endl;//统计大于等于3的个数num = count_if(v.begin(), v.end(), GreaterThan3());// 0 1 2 3 4 5 6 7 8 9 3 3 3 cout << "大于等于3的个数为: " << num << endl;}

三、常用排序算法

merge算法 容器元素合并,并存储到另一容器中
注意 : 两个容器必须是有序的,顺序要一致

void test01()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10;i++){v1.push_back(i);v2.push_back(i + 1);}vector<int>vTarget; //目标容器vTarget.resize(v1.size() + v2.size());merge(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), vTarget.end(), [](int val){cout << val << " "; });}

sort

void test02()
{vector<int>v;for (int i = 0; i < 10;i++){v.push_back(i);}//降序排序sort(v.begin(), v.end(), greater<int>());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl;
}

random_shuffle算法 对指定范围内的元素随机调整次序

void test03()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}random_shuffle(v.begin(), v.end());for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl;
}

reverse算法 反转指定范围的元素

void test04()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}cout << "反转前打印:" << endl;for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl;reverse(v.begin(), v.end());cout << "反转后打印: " << endl;for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl;
}

四、常用拷贝和替换算法

copy算法 将容器内指定范围的元素拷贝到另一容器中

void test01()
{vector<int>v;for (int i = 0; i < 10;i++){v.push_back(i);}vector<int>v2;v2.resize(v.size());copy(v.begin(), v.end(), v2.begin());//for_each(v2.begin(), v2.end(), [](int val){cout << val << " "; });//cout << endl;copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));cout << endl;
}

replace算法 将容器内指定范围的旧元素修改为新元素
replace_if(iterator beg, iterator end, _callback, newvalue) 按条件替换

class MyReplace
{
public:bool operator()(int val){return val > 3;}
};
void test02()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}//将容器中的3替换为 3000replace(v.begin(), v.end(), 3, 3000);copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;//将容器中所有大于3的都替换为 30000;replace_if(v.begin(), v.end(), MyReplace() , 30000);// 0 1 2 30000 ...copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;
}//swap交换
void test03()
{vector<int>v;for (int i = 0; i < 10; i++){v.push_back(i);}vector<int>v2(10, 100);cout << "交换数据前:" << endl;copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));cout << endl;cout << "交换数据后:" << endl;swap(v, v2);copy(v.begin(), v.end(), ostream_iterator<int>(cout, " "));cout << endl;copy(v2.begin(), v2.end(), ostream_iterator<int>(cout, " "));cout << endl;}

五、常用算数生成算法

#include //accumulate算法头文件
//accumulate算法 计算容器元素累计总和

void test01()
{vector<int>v;for (int i = 0; i <= 100;i++){v.push_back(i);}int num = accumulate(v.begin(), v.end(),1000); // 参数3代表 累加起始值cout << "num = " << num << endl;
}

fill算法 向容器中添加元素

void test02()
{vector<int>v;v.resize(10);fill(v.begin(), v.end(), 100);for_each(v.begin(), v.end(), [](int val){cout << val << " "; });cout << endl;}

六、常用集合算法

set_intersection算法 求两个set集合的交集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址

void test01()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10;i++){v1.push_back(i);v2.push_back(i + 5);}vector<int>vTarget;vTarget.resize(min(v1.size(), v2.size()));vector<int>::iterator itEnd = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, [](int val){cout << val << " "; });cout << endl;
}

set_union算法 求两个set集合的并集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址

void test02()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);v2.push_back(i + 5);}vector<int>vTarget;vTarget.resize(v1.size() + v2.size());vector<int>::iterator itEnd  = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());for_each(vTarget.begin(), itEnd , [](int val){cout << val << " "; });cout << endl;
}

set_difference算法 求两个set集合的差集
注意:两个集合必须是有序序列
@param beg1 容器1开始迭代器
@param end1 容器1结束迭代器
@param beg2 容器2开始迭代器
@param end2 容器2结束迭代器
@param dest 目标容器开始迭代器
@return 目标容器的最后一个元素的迭代器地址

void test03()
{vector<int>v1;vector<int>v2;for (int i = 0; i < 10; i++){v1.push_back(i);v2.push_back(i + 5);}vector<int>vTarget;vTarget.resize( max(v1.size(),v2.size()) );// A 与 B 差集//vector<int>::iterator itEnd  = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), vTarget.begin());// B 与 A 差集vector<int>::iterator itEnd = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), vTarget.begin());for_each(vTarget.begin(), itEnd, [](int val){cout << val << " "; });cout << endl;}

总结

到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/15137.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++学习篇】C++11第二期学习

目录 1. 可变参数模板 1.1 基本语法及原理 1.2 包扩展 1.3empalce系列接⼝ 2. lamba 2.1 lambda的语法表达式 2.2 捕捉列表 2.3 lamba的原理 1. 可变参数模板 1.1 基本语法及原理 1. C11⽀持可变参数模板&#xff0c;也就是说⽀持可变数量参数的函数模板和类模板&…

开放式TCP/IP通信

一、1200和1200之间的开放式TCP/IP通讯 第一步&#xff1a;组态1214CPU&#xff0c;勾选时钟存储器 第二步&#xff1a;防护与安全里面连接机制勾选允许PUT/GET访问 第三步&#xff1a;添加PLC 第四步&#xff1a;点击网络试图&#xff0c;选中网口&#xff0c;把两个PLC连接起…

迁移学习 Transfer Learning

迁移学习&#xff08;Transfer Learning&#xff09;是什么&#xff1f; 迁移学习是一种机器学习方法&#xff0c;它的核心思想是利用已有模型的知识来帮助新的任务或数据集进行学习&#xff0c;从而减少训练数据的需求、加快训练速度&#xff0c;并提升模型性能。 &#x1f…

爬虫技巧汇总

一、UA大列表 USER_AGENT_LIST 是一个包含多个用户代理字符串的列表&#xff0c;用于模拟不同浏览器和设备的请求。以下是一些常见的用户代理字符串&#xff1a; USER_AGENT_LIST [Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; Hot Lingo 2.0),Mozilla…

我们来学人工智能 -- 将Ollama已下载的模型从C盘迁出

题记 未配置OLLAMA_MODELS系统变量导致模型下载到了C盘 迁移步骤 退出ollama 配置OLLAMA_MODELS系统变量 OLLAMA_MODELS&#xff1a;D:\ollama\models 直接将C盘下的models目录剪切到指定目录 检查 cmd命令窗口退出重新打开

Redis 集群原理、主从复制和哨兵模式的详细讲解

引言&#xff1a;本文记录了博主在学习Redis的过程中的原理&#xff0c;了解为什么使用与怎么样使用 Redis 集群&#xff0c;在使用 Redis 集群时出现的主从复制和哨兵模式的相关知识。本文并不涉及Redis安装。 文章目录 一、简单介绍什么是 Redis二、为什么要使用 Redis 集群三…

Java数据结构 | TreeMap 和 TreeSet

TreeMap 和 TreeSet 1. 搜索树1.1 概念1.2 搜索树的查找、插入、删除思路及代码1.2.1 查找1.2.2 插入1.2.3 删除&#xff08;难点&#xff09; 1.3 二叉搜索树的性能分析 2. Map 和 Set2.1 Map 接口2.1.1 Map.Entry<K,V>2.1.2 Map的常用方法 2.2 Set 接口2.2.1 Set 的常用…

智能理解 PPT 内容,快速生成讲解视频

当我们想根据一版 PPT 制作出相对应的解锁视频时&#xff0c;从撰写解锁词&#xff0c;录制音频到剪辑视频&#xff0c;每一个环节都需要投入大量的时间和精力&#xff0c;本方案将依托于阿里云函数计算 FC 和百炼模型服务&#xff0c;实现从 PPT 到视频的全自动转换&#xff0…

小鹅通首页网页开发

一、小鹅通首页开发 二、代码&#xff1a; index.html: <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

离散型变量的 PSI-群体稳定性指标计算

文章目录 PSI-群体稳定性指标(离散型)单个指标计算所有指标计算 PSI-群体稳定性指标(离散型) 单个指标计算 代码 import pandas as pddf pd.read_csv(/Users/mengzhichao/Desktop/文件/图表/小微企业用电量数据.csv)X_train df.sample(n7000) X_test df.sample(n3000)计算单…

STM32G474--Whetstone程序移植(单精度)笔记

1 准备基本工程代码 参考这篇笔记从我的仓库中选择合适的基本工程&#xff0c;进行程序移植。这里我用的是stm32g474的基本工程。 使用git clone一个指定文件或者目录 2 移植程序 2.1 修改Whetstone.c 主要修改原本变量定义的类型&#xff0c;以及函数接口全部更换为单精度…

【电机控制器】STC8H1K芯片——低功耗

【电机控制器】STC8H1K芯片——低功耗 文章目录 [TOC](文章目录) 前言一、芯片手册说明二、IDLE模式三、PD模式四、PD模式唤醒五、实验验证1.接线2.视频&#xff08;待填&#xff09; 六、参考资料总结 前言 使用工具&#xff1a; 1.STC仿真器烧录器 提示&#xff1a;以下是本…

Neo4j图数据库学习(二)——SpringBoot整合Neo4j

一. 前言 本文介绍如何通过SpringBoot整合Neo4j的方式&#xff0c;对图数据库进行简单的操作。 Neo4j和SpringBoot的知识不再赘述。关于Neo4j的基础知识&#xff0c;有兴趣可以看看作者上一篇的文章&#xff1a;Neo4j图数据库学习(一)——初识CQL 二. 前置准备 新建SpringBo…

【后端开发】系统设计101——Devops,Git与CICD,云服务与云原生,Linux,安全性,案例研究(30张图详解)

【后端开发】系统设计101——Devops&#xff0c;Git与CICD&#xff0c;云服务与云原生&#xff0c;Linux&#xff0c;安全性&#xff0c;案例研究&#xff08;30张图详解&#xff09; 文章目录 1、DevopsDevOps与SRE与平台工程的区别是什么&#xff1f;什么是k8s&#xff08;Ku…

01_Machine Vision_LSI及傅立叶变换

outline 图像分解和线性时不变系统二维傅立叶变换图像采样 图像分解和线性时不变系统 图像数学表达 图像由基本的像素点组成&#xff0c;如果将每一个像素点看作一个脉冲&#xff0c;则每个像素点的值可以看作是脉冲的幅值&#xff0c;这样图像就可以看作是由一系列脉冲组成…

elasticsearch实战三 elasticsearch与mysql数据实时同步

一 介绍 elasticsearch数据不是一直不变的&#xff0c;需要与mysql、oracle等数据库的数据做同步。 本博客里涉及到的项目地址&#xff1a;https://www.aliyundrive.com/s/7bRWpTYsxWV 方案一&#xff1a; 同步调用&#xff0c;即操作mysql数据后&#xff0c;接着操作elastic…

智能化食品安全管理:AI视频监控在大型商场的技术方案

前言 在卖场中&#xff0c;尤其是熟食区&#xff0c;AI视频监控的应用对于食品安全至关重要。通过AI视频监控系统&#xff0c;卖场可以实时监测食品处理环节中的每一个细节&#xff0c;从员工的个人防护到清洁操作&#xff0c;再到区域管理&#xff0c;全面提升食品安全管理的…

分析模式应用――帐务模式02

Party 模式中的层次结构模型支持多种灵活的层次结构&#xff0c;但这里我们只要关心上下级的包含关系就可以了&#xff0c;参加结算的称为结算实体BalanceEntity&#xff0c; 不可再拆分的称为LeafEntity&#xff0c; 可以包含下级结算实体的称为CompositeEntity&#xff0c;因…

什么是网络安全

1) 什么是网络安全 作为程序员&#xff0c;主要是面向产品的安全的问题。比如sql注入&#xff0c;xss&#xff0c;csrf&#xff0c;cookie窃取等等&#xff0c;都值得我们去思考。保证网站运行正常&#xff0c;客户数据安全。 2) sql注入 简单的说&#xff0c;就是利用表单提…

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…