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

【C++】22___STL常用算法

目录

一、常用遍历算法

二、常用查找算法

2.1 find

2.2 其它查找算法

三、常用排序算法 

3.1 sort 

3.2 其它排序算法

四、拷贝 & 替换

4.1 copy 

4.2 其它算法

五、常用的算数生成算法

5.1 accumulate

5.2 fill

六、常用集合算法

6.1  set_intersection

6.2 其它算法


概述:

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

一、常用遍历算法

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

for_each()代码示例 

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print1(int var){cout<<var<<" ";
}class print2{
public:void operator()(int var){cout<<var<<" ";}
};void test(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}for_each(v.begin() , v.end() , print1);cout<<endl;for_each(v.begin() , v.end() , print2());cout<<endl;
}int main(){test();return 0;
}

 transform代码示例

 函数原型:

  • transform(iterator beg1 , iterator end1 , iterator beg2 , _func);
  • //beg1源容器开始迭代器
  • //end1源容器结束迭代器
  • //beg2目标容器开始迭代器
  • //_func 函数或者函数对象
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>class re{
public:int operator()(int var){return var;}
};class print{
public:void operator()(int var){cout<<var<<" ";}
};void test(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}vector<int>v2;v2.resize(v1.size());transform(v1.begin() , v1.end() , v2.begin() ,re());for_each(v2.begin() , v2.end() , print());}int main(){test();return 0;
}

二、常用查找算法

简介:

  • find  //查找元素
  • find_if  //按条件查找元素
  • adjacent_find  //查找相邻重复元素
  • binary_search  //二分查找法
  • count  //统计元素个数
  • count_if  //按条件统计元素个数
2.1 find

函数原型:

  • find(interator beg , iterator end , value);

代码示例 

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>class person{
public:person(string name , int age){this->m_Name = name;this->m_Age = age;}bool operator==(const person&p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}
public:string m_Name;int m_Age;
};void test1(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}vector<int>::iterator it = find(v1.begin() , v1.end() , 4);if(it != v1.end()){cout<<"找到了:"<<*it<<endl;}else{cout<<"没找到"<<endl;}
}void test2(){vector<person>v2;person p1("a",18);person p2("b",19);person p3("c",20);person p4("d",21);v2.push_back(p1);v2.push_back(p2);v2.push_back(p3);v2.push_back(p4);person pp("c",20);vector<person>::iterator it = find(v2.begin() , v2.end() , pp);if(it == v2.end()){cout<<"没找到"<<endl;}else{cout<<"找到了:"<<it->m_Name<<" "<<it->m_Age<<endl;}
}int main(){test1();test2();return 0;
}
2.2 其它查找算法

按条件查找:find_if 

  • find_if(iterator beg , iterator end , _Pred);  //按值查找元素,找到返回指定位置迭代器;找不到返回结束迭代器位置。

查找相邻重复元素:adjacent_find

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

查找指定元素是否存在:binary_search

  • bool binary_search(iterator beg , iterator eng , value);  //查找指定的元素,查到返回true、否则返回false。     注:在无序序列中不可用

统计元素个数:count

  • count(iterator beg , iterator end , value);  //统计元素出现次数

按条件统计元素个数:count_if

  • count_if(iterator beg , iterator end , _Pred);  //按条件统计元素个数

三、常用排序算法 

简介:

  • sort  //对容器内元素进行排序
  • random_shuffle  //指定范围内的元素随机调整次序
  • merge  //容器元素合并,并存储到另一个容器中
  • reverse  //反转指定范围的元素
3.1 sort 

函数原型:

  • sort(iterator beg , iterator end , _Pred);   

代码示例 

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.push_back(10);v.push_back(50);v.push_back(20);v.push_back(30);v.push_back(40);sort(v.begin() , v.end() );//默认升序for_each(v.begin() , v.end() , print);sort(v.begin() , v.end() , greater<int>());//降序cout<<endl;for_each(v.begin() , v.end() , print);
}int main(){test();return 0;
}
3.2 其它排序算法

 洗牌算法:random_shuffle

  • random_shuffle(iterator beg , iterator end);  //指定范围内的元素随机调整次序

两个容器合并,并存储到另一个容器中:merge

  • merge(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);  //两个容器必须是有序的,且合并后仍是有序的

容器内元素进行反转:reverse

  • reverse(iterator beg , iterator end);

四、拷贝 & 替换

简介:

  • copy  //容器内指定范围的元素拷贝到另一容器中
  • replace  //将容器内指定范围的旧元素修改为新元素
  • replace_if  //容器内指定范围满足条件的元素替换为新元素
  • swap  //互换两个容器的元素
4.1 copy 

函数原型:

  • copy(iterator beg , iterator end , iterator dest);  //容器内指定范围的元素拷贝到另一容器中

代码示例

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.push_back(12);v.push_back(13);v.push_back(14);vector<int>v2;v2.resize(v.size());copy(v.begin() , v.end() , v2.begin());for_each(v2.begin() , v2.end() , print);cout<<endl;
}int main(){test();return 0;
}
4.2 其它算法

将容器内指定范围的旧元素修改为新元素:replace

  • replace(iterator beg , iterator end , oldvalue , newvalue);

将区间满足条件元素替换为指定元素:replace_if

  • replace_if(iterator beg , iterator end , _pred , newvalue);

互换两个容器的元素:swap

  • swap(container c1 , container c2);

五、常用的算数生成算法

算法简介:

  • accumulate  //计算容器元素累计总和
  • fill  //向容器中添加元素
5.1 accumulate

函数原型:

  • accumulate(iterator beg , iterator end , value);  //需包含头文件#include<numeric> ,  参数三为起始的累加值

代码示例 

#include<iostream>
using namespace std;
#include<vector>
#include<numeric>void test(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}int num = accumulate(v.begin() , v.end() , 0);cout<<num<<endl;
}int main(){test();return 0;
}
5.2 fill

函数原型:

  • fill(iterator beg , iterator end , value); 

 代码示例

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.resize(10);fill(v.begin() , v.end() , 100);for_each(v.begin() , v.end() , print);
}int main(){test();return 0;
}

六、常用集合算法

算法简介:

  • set_intersection  //求两个容器的交集
  • set_union  //并集
  • set_difference   //差集
6.1  set_intersection

函数原型:

  • set_intersection(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 求交集的两个集合必须为有序序列
  3. 目标容器开辟空间需要从两个容器中取最小值

代码示例 

#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v1;vector<int>v2;for(int i=0;i<10;i++){v1.push_back(i);v2.push_back(i+5);}vector<int>vT;vT.resize( min(v1.size() , v2.size()) );vector<int>::iterator END = set_intersection(v1.begin() , v1.end() , v2.begin() , v2.end() , vT.begin());for_each( vT.begin() , END , print);
}int main(){test();return 0;
}
6.2 其它算法

两集合的并集:set_union

  • set_union(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 两个集合必须为有序序列
  3. 目标容器开辟空间需要两个容器相加

两集合的差集:set_difference

  • set_difference(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); 
  1. 返回目标容器最后一个元素的迭代器地址
  2. 两个集合必须为有序序列
  3. 目标容器开辟空间需要两个容器的较大值

相关文章:

【C++】22___STL常用算法

目录 一、常用遍历算法 二、常用查找算法 2.1 find 2.2 其它查找算法 三、常用排序算法 3.1 sort 3.2 其它排序算法 四、拷贝 & 替换 4.1 copy 4.2 其它算法 五、常用的算数生成算法 5.1 accumulate 5.2 fill 六、常用集合算法 6.1 set_intersection 6…...

意静明和-十成

十成 责任&#xff08;健康&#xff09;、使命&#xff08;事业&#xff09;、信念&#xff08;意义&#xff09;、自律&#xff08;排诱&#xff09;、自修&#xff08;知识&#xff09;、总结&#xff08;四为&#xff09;、执行&#xff08;一事不拖&#xff09;、人情&…...

easyui textbox使用placeholder无效

easyui textbox使用placeholder无效 在easyui 的textbox控件&#xff0c;请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...

flux中的缓存

1. cache&#xff0c;onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存&#xff0c;但是当下游消费者的处理速度比上游生产者慢时&#xff0c;上游生产的数据会被暂时存储在缓冲区中&#xff0c;防止丢失。 2. Flux.range 默认…...

代码重定位详解

文章目录 一、段的概念以及重定位的引入1.1 问题的引入1.2 段的概念1.3 重定位 二、如何实现重定位2.1 程序中含有什么&#xff1f;2.2 谁来做重定位&#xff1f;2.3 怎么做重定位和清除BSS段&#xff1f;2.4 加载地址和链接地址的区别 三、散列文件使用与分析3.1 重定位的实质…...

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备

课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课&#xff0c;建立您需要的技能&#xff0c;以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动&#xff0c;学…...

从0到机器视觉工程师(一):机器视觉工业相机总结

目录 相机的作用 工业相机 工业相机的优点 工业相机的种类 工业相机知名品牌 光源与打光 打光方式 亮暗场照明 亮暗场照明的应用 亮暗场照明的区别 前向光漫射照明 背光照明 背光照明的原理 背光照明的应用 同轴光照明 同轴光照明的应用 总结 相机的作用 相机…...

Docker安装(Docker Engine安装)

一、Docker Engine和Desktop区别 Docker Engine 核心组件&#xff1a;Docker Engine是Docker的核心运行时引擎&#xff0c;负责构建、运行和管理容器。它包括守护进程&#xff08;dockerd&#xff09;、API和命令行工具客户端&#xff08;docker&#xff09;。适用环境&#…...

数组的深度监听deep

场景&#xff1a;组件提供的emit事件可能被占用&#xff0c;在不能使用事件提交的情况下&#xff0c;就要上watch数组监听了&#xff0c;但是是发现只有在数组的长度发生变化的时候才会触发监听&#xff0c;这怎么行。。。。。 对于对象数组的深度监听&#xff0c;如果没有正确…...

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)

文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定&#xff1a;https://blog.csdn.net/m0_65152767/article/details…...

UniApp 性能优化策略

一、引言 在当今数字化时代&#xff0c;移动应用的性能成为影响用户留存与满意度的关键因素。UniApp 作为一款热门的跨平台开发框架&#xff0c;以一套代码适配多端的特性极大提升了开发效率&#xff0c;但同时也面临着性能优化的挑战。优化 UniApp 性能&#xff0c;不仅能够让…...

【Linux报告】实训六 重置超级用户密码

实训六 重置超级用户密码 2018编写-今日公布 【练习一】忘记root密码 步骤一&#xff1a;开启或重启系统&#xff0c;并且要在五秒之内按任何键&#xff1b; 步骤二&#xff1a;按任意键&#xff0c;停止进入系统&#xff0c;按【e】键&#xff0c;跳转新页面&#xff0c;再…...

smolagents:一个用于构建代理的简单库

HF推出 smolagents&#xff0c;一个非常简单的库&#xff0c;它能够解锁语言模型的代理功能。以下是它的简要介绍&#xff1a; from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModelagent CodeAgent(tools[DuckDuckGoSearchTool()], modelHfApiModel())agent…...

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…...

云手机 —— 手机矩阵的 “超级外挂

如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先&#xff0c;明确打造手机矩阵的目的和需求&#xff0c;是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...

OpenCV的TickMeter计时类

OpenCV的TickMeter计时类 1. TickMeter是一个计时的类1.1 计算耗时1.2 计算循环的平均耗时和FPS1.3 function 2. 案例 1. TickMeter是一个计时的类 https://docs.opencv.org/4.x/d9/d6f/classcv_1_1TickMeter.html#details 1.1 计算耗时 TickMeter tm;tm.start();// do some…...

蓝桥杯JAVA刷题--001

文章目录 题目需求2.代码3.总结 题目需求 2.代码 class Solution {public String convertDateToBinary(String date) {if (date null || date.length() ! 10 || date.charAt(4) ! - || date.charAt(7) ! -) {throw new IllegalArgumentException("输入的日期格式不正确&…...

免费又开源:企业级物联网平台的新选择 ThingsPanel

在开源领域&#xff0c;选择合适的开源协议是开发者和企业能否充分利用平台的关键。ThingsPanel&#xff0c;作为一个专注于物联网的开源平台&#xff0c;近日将协议从 AGPLv3 改为更开放的 Apache 2.0。这一改变对开发者和用户意味着什么&#xff1f; 为什么协议要从 AGPLv3 转…...

鸿蒙开发:文本合成语音

前言 Android开发的同学都知道&#xff0c;在Android当中&#xff0c;实现一段文字合成语音播放&#xff0c;可以使用系统提供的对象TextToSpeech来很快的实现&#xff0c;如果不用系统自带的&#xff0c;也可以使用三方提供的&#xff0c;比如讯飞的语音合成等等&#xff0c;总…...

雷军:科技传奇的逐梦之旅

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

大数据治理的常见方式

大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法&#xff0c;以下是几种常见的治理方式&#xff1a; 1. 数据质量管理 核心方法&#xff1a; 数据校验&#xff1a;建立数据校验规则&#xff08;格式、范围、一致性等&#xff09;数据清洗&…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...