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

c++常用stl算法

1、头文件

        这些算法通常包含在头文件<algorithm> <functional> <numeric>中。

 2、常用遍历算法

for_each(v.begin(),v.end(), 元素处理函数/仿函数) 

注意:在使用transform转存时,目标容器需要提取开辟合适的空间。 

void printfunc(int val) {cout << val << " ";
}
class Printoperator {
public:void operator()(int val) {cout << val << " ";}
};
int main() {vector<int> vi(10, 3);//输入一般函数完成for_each算法中的元素处理for_each(vi.begin(), vi.end(), printfunc);cout << endl;//输入仿函数完成for_each算法中的元素处理for_each(vi.begin(), vi.end(), Printoperator());cout << endl;system("pause");return 0;
}
class Printoperator {
public:int operator()(int val) {return val + 1;}
};
void print(vector<int> &v) {for (auto i : v) {cout << i << " ";}cout << endl;
}
int main() {vector<int> vi(10, 3);vector<int> vi2(4, 5);//需要提前给目标容器开辟空间,不然会报错vi2.resize(vi.size());transform(vi.begin(), vi.end(), vi2.begin(), Printoperator());print(vi2);system("pause");return 0;
}

3、常用查找算法

 find按值查找元素

函数原型:

         使用find查找自定义类型元素的时候,需要在对应类中重载==,以便find算法能知道该怎么比较。

class Person {
public:Person(int age, string name) {this->mAge = age;this->mName = name;}//帮助find查找元素bool operator==(const Person &p) {if (p.mAge == this->mAge && p.mName == this->mName) {return true;}else {return false;}}int mAge;string mName;
};
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(40, "ads");Person p4(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator iter = find(v.begin(), v.end(), p2);if (iter != v.end()) {cout << "逮到 !!!" << endl;}system("pause");return 0;
}

 find_if按值查找元素

         利用find_if按自定义谓词找到合适的自定义类型元素:

class Person {
public:Person(int age, string name) {this->mAge = age;this->mName = name;}int mAge;string mName;
};
class FindPerson {
public:bool operator()(const Person &p) {return p.mAge > 20;}
};
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(40, "ads");Person p4(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator iter = find_if(v.begin(), v.end(), FindPerson());if (iter != v.end()) {cout << (*iter).mName<<" 的年龄超过了20" << endl;}system("pause");return 0;
}

adjacent_find查找相邻重复元素 

         adjacen_find按自定义谓词查找相邻满足条件自定义元素:

class Person {
public:Person(int age, string name) {this->mAge = age;this->mName = name;}int mAge;string mName;
};
class FindPerson {
public:bool operator()(const Person &p1, const Person& p2) {if (p1.mAge == p2.mAge)return true;elsereturn false;}
};
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);vector<Person>::iterator iter = adjacent_find(v.begin(), v.end(), FindPerson());if (iter != v.end()) {cout <<"有相邻年龄相同的人" << (*iter).mName <<"和" << (*(iter+1)).mName << endl;}else {cout << "没有相邻年龄相同的人" << endl;}system("pause");return 0;
}

binary_search查指定元素是否存在(不适用无序序列,必须有序且为升序序列) 

count统计元素出现次数

返回int

class Person {
public:Person(int age, string name) {this->mAge = age;this->mName = name;}//帮助count查找元素bool operator==(const Person &p) {if (p.mAge == this->mAge) {return true;}else {return false;}}int mAge;string mName;
};int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);int num = count(v.begin(), v.end(), p2);cout << "20岁的人有 " << num << "个"  << endl;system("pause");return 0;
}

count_if 按条件统计元素个数 ,返回int

count_if的谓词使用参见find_if。 

4、常用排序算法

        

 sort排序

 对自定义类型排序:

class Person {
public:Person(int age, string name) {this->mAge = age;this->mName = name;}int mAge;string mName;
};
class SortPerson {
public:bool operator()(const Person& p1, const Person& p2) {if (p1.mAge > p2.mAge)return true;elsereturn false;}
};
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);sort(v.begin(), v.end(), SortPerson());system("pause");return 0;
}

random_shuffle随机调序 

int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);random_shuffle(v.begin(), v.end());//cout << "20岁的人有 " << num << "个"  << endl;system("pause");return 0;
}

 

 merge合并容器元素(容器必须有序,提取个目标容器分配空间)

	vector<int> vi1{ 1,2,3,4,5 };vector<int> vi2{ 2,3,4,5,7 };vector<int> target;//提前个target开辟空间target.resize((vi1.size() + vi2.size()));merge(vi1.begin(), vi1.end(), vi2.begin(), vi2.end(),target.begin());

reverse反转容器中的元素 (不需要谓词就能实现自定义类型反转)

 

	vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);reverse(v.begin(), v.end());

5、常用拷贝替换生成算法

copy拷贝(需要预先开辟空间)

注:在拷贝自定义类时,需要有对应的空默认构造函数,如:Person(){}。 

	vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);vector<Person> target;target.resize(v.size());copy(v.begin(), v.end(), target.begin());

replace元素替换

	vector<int> vi1{ 1,2,3,4,5 };replace(vi1.begin(), vi1.end(), 1, 20);

replace_if满足条件元素替换

class Person {
public:Person() {}Person(int age, string name) {this->mAge = age;this->mName = name;}int mAge;string mName;
};class ReplacePerson {
public:bool operator()(const Person& p) {if (p.mAge > 20)return true;elsereturn false;}
};
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person p6(10, "dsaf");replace_if(v.begin(), v.end(), ReplacePerson(), p6);system("pause");return 0;
}

swap交换容器元素

 6、常用算术生成算法

accumulate计算累加

 

自定义类型的某成员变量累加:(也可以采用仿函数形式)

class Person {
public:Person() {}Person(int age, string name) {this->mAge = age;this->mName = name;}int mAge;string mName;
};int Age_acc(int pre,Person& p) {return pre + p.mAge;
}
int main() {vector<Person> v;Person p1(10, "aaa");Person p2(20, "sss");Person p3(20, "sad");Person p4(40, "ads");Person p5(10, "ccc");v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);v.push_back(p5);Person p6(10, "dsaf");int acu = accumulate(v.begin(), v.end(), 0, Age_acc);system("pause");return 0;
}

 fill向容器中填充元素

 7、常用集合算法

 set_intersection求两个容器交集(必须预先开辟目标容器空间)

set_union求两个容器并集

set_difference求两个容器差集

 

相关文章:

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…...

非对称密钥PKCS#1和PKCS#8格式互相转换(Java)

目录一、序言二、代码示例1、Maven依赖2、工具类封装三、测试用例1、密钥文件2、公私钥PKCS1和PKCS8格式互相转换一、序言 之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到…...

java获取当前时间的方法:LocalDateTime、Date、Calendar,以及三者的比较

文章目录前言一、LocalDateTime1.1 获取当前时间LocalDate.now()1.2 获取当前时间的年、月、日、时分秒localDateTime.getYear()……1.3 给LocalDateTime赋值LocalDateTime.of()1.4 时间与字符串相互转换LocalDateTime.parse()1.5 时间运算——加上对应时间LocalDateTime.now()…...

npm link

正文npm link的用法假如我们想自己开发一个依赖包&#xff0c;以便在多个项目中使用。一种可行的方法&#xff0c;也是npm给我们提供的标准做法&#xff0c;那就是我们独立开发好这个 "依赖包"&#xff0c;然后将它直接发布到 npm镜像站 上去&#xff0c;等以后想在其…...

Docker 如何配置镜像加速

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如&#xff1a; 科大镜像&#xff1a;https://docker.mirrors.ustc.edu.cn/网易&#xff1a;https://hub-…...

阅读笔记7——Focal Loss

一、提出背景 当前一阶的物体检测算法&#xff0c;如SSD和YOLO等虽然实现了实时的速度&#xff0c;但精度始终无法与两阶的Faster RCNN相比。是什么阻碍了一阶算法的高精度呢&#xff1f;何凯明等人将其归咎于正、负样本的不平衡&#xff0c;并基于此提出了新的损失函数Focal L…...

ZCMU--5009: 龙虎斗

轩轩和开开正在玩一款叫《龙虎斗》的游戏&#xff0c;游戏的棋盘是一条线段&#xff0c;线段上有n个兵营(自左至右编号1~n)&#xff0c;相邻编号的兵营之间相隔1厘米&#xff0c;即棋盘为长度为n-1厘米的线段。i号兵营里有ci位工兵。 下面图1为n 6的示例: 轩轩在左侧&#xf…...

创建项目(React+umi+typeScript)

项目框架搭建的方式react脚手架Ant-design官网一、安装方式npm二、安装方式yarn三、安装方式umi devreact脚手架 命令行&#xff1a; npx create-react-app myReactName项目目录结构&#xff1a; 浏览器运行&#xff0c;端口号3000&#xff1a; Ant-design官网 一、安装方…...

FISCO BCOS(二十七)———java操作WeBase

一、搭建fiscobcos环境 1.1、安装jdk1.8 https://blog.csdn.net/weixin_46457946/article/details/1232435131.2、安装mysql https://blog.csdn.net/weixin_46457946/article/details/1232447361.3、安装python https://blog.csdn.net/weixin_46457946/article/details/123…...

失眠时还在吃它?有风险,你了解过吗

失眠&#xff0c;是当代人的通病。所以解决失眠也成了刚需&#xff0c;市面上开始出现各种助眠产品。有商业机构调查发现&#xff0c;62%的90后消费者曾买过助眠产品&#xff0c;其中人气选手就是褪黑素。褪黑素本身就是人体天然存在的&#xff0c;与睡眠有关的物质&#xff0c…...

星戈瑞收藏Sulfo-CY7 amine/NHS ester/maleimide小鼠活体成像染料标记反应

关于小鼠活体成像&#xff0c;就一定要提到CY活性染料标记反应&#xff1a; 用不同的活性基团的Cyanine菁染料和相应的活性基团的生物分子或小分子药物发生反应&#xff0c;链接到一起。 根据需要标记的抗原、抗体、酶、多肽等分子所带的可标记基团的种类&#xff08;氨基、醛…...

守护最后一道防线:Coremail邮件安全网关推出邮件召回功能

根据Coremail邮件安全大数据中心2022年Q4季报显示&#xff0c;2021年CAC识别钓鱼邮件1.81亿&#xff0c;2022年上升至2.25亿&#xff0c;增幅高达24.1%。 这表明2022年平均每天有61万7088封钓鱼邮件被接收及发出&#xff0c;企业用户面临潜在经济损失不可估量。 尤其是活跃至今…...

Python实战之小说下载神器(二)整本小说下载:看小说不用这个程序,我实在替你感到可惜*(小说爱好者必备)

前言 这次的是一个系列内容给大家讲解一下何一步一步实现一个完整的实战项目案例系列之小说下载神器&#xff08;二&#xff09;&#xff08;GUI界面化程序&#xff09; 单章小说下载保存数据——整本小说下载 你有看小说“中毒”的经历嘛&#xff1f;小编多多少少还是爱看小说…...

ChatGPT三个关键技术

情景学习&#xff08;In-context learning&#xff09; 对于一些LLM没有见过的新任务&#xff0c;只需要设计一些任务的语言描述&#xff0c;并给出几个任务实例&#xff0c;作为模型的输入&#xff0c;即可让模型从给定的情景中学习新任务并给出满意的回答结果。这种训练方式能…...

考试系统 (springboot+vue前后端分离)

系统图片 下载链接 地址&#xff1a; http://www.gxcode.top/code 介绍 一款多角色在线培训考试系统&#xff0c;系统集成了用户管理、角色管理、部门管理、题库管理、试题管理、试题导入导出、考试管理、在线考试、错题训练等功能&#xff0c;考试流程完善。 技术栈 Spr…...

ChatGPT告诉你:项目管理能干到60岁吗?

早上好&#xff0c;我是老原。这段时间最火的莫过于ChatGPT&#xff0c;从文章创作到论文写作&#xff0c;甚至编程序&#xff0c;简直厉害的不要不要的。本以为过几天热度就自然消退了&#xff0c;结果是愈演愈烈&#xff0c;热度未减……大家也从一开始得玩乐心态&#xff0c…...

Python自动化测试框架【Allure-pytest功能特性介绍】

Python自动化测试框架【Allure-pytest功能特性介绍】 目录&#xff1a;导读 前言 生成报告 测试代码 目录结构 Allure特性 Environment Categories Fixtures and Finalizers allure.attach 总结 写在最后 前言 Allure框架是一个灵活的轻量级多语言测试报告工具&am…...

ToB 产品拆解—Temu 商家管理后台

Temu 是拼多多旗下的跨境电商平台&#xff0c;平台产品于9月1日上线&#xff0c;9月1日到9月15日为测试期&#xff0c;之后全量全品类放开售卖。短短几个月的时间&#xff0c;Temu 在 App Store 冲上了购物类榜首&#xff0c;引起了国内的广泛关注。本文将以 B 端产品经理的角度…...

Android Studio的笔记--socket通信

Android socket通信Socket协议android socket 代码清单文件开启服务服务端&#xff1a;TCPServerService客户端&#xff1a;TCPClientServicelogSocket Socket 作为一种通用的技术规范&#xff0c;首次是由 Berkeley 大学在 1983 为 4.2BSD Unix 提供的&#xff0c;后来逐渐演化…...

@Async 注解

异步执行 异步调用就是不用等待结果的返回就执行后面的逻辑&#xff1b;同步调用则需要等待结果再执行后面的逻辑。 通常我们使用异步操作时都会创建一个线程执行一段逻辑&#xff0c;然后把这个线程丢到线程池中去执行&#xff0c;代码如下所示。 ExecutorService executor…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...

深度解析:etcd 在 Milvus 向量数据库中的关键作用

目录 &#x1f680; 深度解析&#xff1a;etcd 在 Milvus 向量数据库中的关键作用 &#x1f4a1; 什么是 etcd&#xff1f; &#x1f9e0; Milvus 架构简介 &#x1f4e6; etcd 在 Milvus 中的核心作用 &#x1f527; 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...