C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric>
遍历算法:
for_each、transform(搬运容器到另一个容器中 )
void print1(int val)
{cout << val <<" ";
}
for_each (v.begin(),v.end() , print1)
或者用仿函数的形式遍历:
class print2{
public:void operator()(int val){cou <<val <<" ";}
}
for_each(v.begin(),v.end(),print2()) ; 不同于上述,此处需要传入匿名函数对象
对于transform搬运算法:
vector <int> vtarget; //创建目标容器
vtarget.resize(v.size()) ; //目标容器必须提前开辟空间,与原vector一致,否则无法搬运
class trans1{
public :int operator () (int val ){return val; }
}
transform (v.begin();v.end();vtarget.begin(),trans1()); //最后需要加个仿函数 ,注意中间的vtarget.begin()迭代器
查找算法:
find //查找元素 ,找到返回指定元素的迭代器,找不到返回结束迭代器end();
利用find可以在容器中找指定的元素,返回值是迭代器,使用迭代器接收
find_if //按条件查找元素 ,三个参数:开始迭代器、结束迭代器、谓词(返回bool的仿函数)
vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it ==v.end()) {...} //没找到
else{} ; //找到了
对于查找自定义数据类型:
class Person{public:person(string name ,int age){this->m_Name = name;this->m_Age = age;
}
public:string m_Name;int m_Age ;
};class Greater{bool operator()(Person &p){return p.m_Age >20;
}
}vector <Person>::iterator it = find_if (v.begin() , v.end() , Greater());
if(it == v.end()){};
else {};
adjacent_find //查找相邻重复元素,返回相邻重复元素的第一个元素迭代器
vector<int>::iterator pos = adjacent_find(v.begin(), v.end());
binary_search //二查找法,查找指定元素是否存在,但是只能在有序数组中使用,返回一个bool类型,速度快,logN时间复杂度
bool ret =binary_search(v.begin(),v.end(),9 ) //查找容器中是否有9元素,但是只能是升序,降序需要提供重载版本
//升序vector<int> v;for (int i = 0; i < 10; i++) {v.push_back(i);}bool ret = binary_search(v.begin(), v.end(), 8);if (ret == true) {cout << "true" << endl;}else {cout << "false" << endl;}//测试降序是否适用vector<int> v1;for (int i = 10; i > 0; i--) {v1.push_back(i);}bool ret2 = binary_search(v1.begin(), v1.end(), 8);if (ret2 == true) {cout << "true" << endl;}else {cout << "false" << endl;}//结果输出:
true
false
count //统计元素个数,返回一个int整形。
int num=count(v.begin(),v.end(),40);
count_if //按条件统计元素个数
int num = count_if (v.begin(),v.end(),Greater()) ; 最后一个参数为谓词
或者自定义数据类型:
排序算法:
sort(v.begin(),v.end()); //升序排列,降序需要添加<functional>中的模板
void myPrint(int val)
{cout << val <<" ";}
sort(v.begin(),v.end(),greater<int>());
for_each (v.begin(),v.end(),myPrint);
打乱算法:random_shuffle
srand((unsigned int) time (NULL)); // 使用时间作为随机数种子来确保真正的随机
random_shuffle(v.begin(),v.end());
合并算法:merge(前提两个容器必须有序,合并之后的也是有序的)
//目标容器
vector<int>vTarget;
vTarget.resize(v1.size()+v2.size()); // 前提必须要给目标容器分配内存!!!
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
数据反转:reverse
reverse(v.begin,v.end());
拷贝和替换算法:
vector <int> v2;
v2.resize(v1.size()); //注意记得先开辟空间!
copy(v1.begin(),v1.end(),v2.begin());
替换算法:replace
replace(v1.begin(),v1.end() ,20 , 2000) ; // 把所有的20替换为2000
按照条件替换:replace_if
一般构建仿谓词来作为参数
构建谓词(把大于等于30 的数替换)
class Greater30
{
public :
bool operator() (int val ){
return val>=30;
}
}
replace_if (v1.begin() , v1. end() , Greater30() ,30000) ; 把大于等于30的数替换为30000;
常用算数生成算法:#include <numeric>
accumulate // 计算容器元素累计总和,可以设置起始值
fill // 向容器中添加元素,填充所有空间为指定的值
int sum = accumulate(v.begin() , v.end() , value); //value 表示起始的累加值
常用的集合算法: (此处的集合并不指set容器,而是数学概念)
求交集: set_ intersection (原容器必须是有序序列)
vector <int> vtarget;
vtarget.resize(min(v1.size(),v2.size())) ; //这样做是考虑到最大的目标容器内存情况:原容器1包含原容器2
vector<int>::interator itEnd=set_ intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin()); //返回迭代器,指向新的vtarget的最后
打印输出:
for_each (vTarget.begin(),itEnd , myprint());
求并集 : set_union(原容器必须是有序序列)
vtarget.resize(v1.size()+v2.size()) ; //这样做是考虑到最大的目标容器内存情况:原容器1与原容器2无交集
vector<int>::interator itEnd=set_ union(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin()); //返回迭代器,指向新的vtarget的最后
打印输出:
for_each (vTarget.begin(),itEnd , myprint());
求差集 : set _difference
相关文章:

C++:STL常用算法随笔
主要的头文件#include <algorithm> < functional> <numeric> 遍历算法: for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...
Python NumPy学习指南:从入门到精通
Python NumPy学习指南:从入门到精通 第一部分:NumPy简介与安装 1. 什么是NumPy? NumPy,即Numerical Python,是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray,并支持大量的数学函…...
Flutter笔记--通知
这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制,在widget树中,每一个节点都可以分发通知,通知会沿着当前节点向上传递,所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(二)
目录 template行 template pre-line template line template syl template syl noblank template char template notext template pre-line notext template syl noblank notext template keeptags 编辑 template loop number 内联变量 编辑 remeber函数 re…...

系统分析师16:系统测试与维护
1 内容概要 2 软件测试类型 2.1 测试类型 动态测试【计算机运行】 白盒测试法:关注内部结构与逻辑灰盒测试法:介于两者之间黑盒测试法:关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…...

详解Java中的堆内存
详解Java中的堆内存 堆是JVM运行数据区中的一块内存空间,它是线程共享的一块区域(注意了!!!),主要用来保存数组和对象实例等(其实对象有时候是不在堆中进行分配的,想要了…...
C++类和对象下详细指南
C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量,特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表,成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...
【瑞昱RTL8763E】音频
1 音乐播放控制 1.1 播放列表更新 文件系统在sd卡中保存header.bin及name.bin两份文件用于歌曲名称的存储。为方便应用层进行歌曲显示及列表管理,可将这两个bin文件信息读取并保存到nor flash中。需要播放指定名称的歌曲时,将对于歌曲名称传递给文件系…...
videojs 播放监控
<head><!-- 1. 引入videojs的CSS。 --><link href"https://vjs.zencdn.net/7.20.3/video-js.css" rel"stylesheet" /><!-- If youd like to support IE8 (for Video.js versions prior to v7) --><!-- <script src"htt…...

电源管理芯片PMIC
一、简介 电源管理芯片(Power Management Integrated Circuits,简称PMIC)是一种集成电路,它的主要功能是在电子设备系统中对电能进行管理和控制,包括但不限于以下几点: 电压转换:将电源电压转换…...

C++ 线性表、内存操作、 迭代器,数据与算法分离。
线性表: 线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的 一种,一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系,即除了第一个和…...
PHP如何解析配置文件
在PHP中解析配置文件有多种方法,具体取决于配置文件的格式。常见的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP数组文件(即PHP文件本身包含配置数组)。下面是一些常用的方法来解析这些配置文件。 1. 解析INI文件 INI文件是最常见的…...

【Java】六大设计原则和23种设计模式
目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …...

Java IO流全面教程
此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象,指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…...

PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范
先附上我之前写的关于PCIe5.0金手指的设计解读: PCIe5.0的Add-in-Card(AIC)金手指layout建议(一)_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议(二)_gnd bar-CSDN博客 首先,相较于PCI…...
二、创建drf纯净项目
1)创建项目 django-admin startproject api2)创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…...

算法1:双指针思想的运用(2)--C++
1.盛水最多的容器 题目链接:11. 盛最多水的容器 - 力扣(LeetCode) 题目解析: 在解析题目时,我们可以把最直接的方法先列举出来,然后再根据相应的算法原理,来进行优化 思路一:暴力…...

L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数
L2.7 CPU调度策略 1、调度的策略 周转时间:任务进入到任务结束(后台任务更关注)响应时间:操作发生到响应时(前台任务更关注)吞吐量:CPU完成的任务量 响应时间小 -> 切换次数多 -> 系统…...

免费版U盘数据恢复软件大揭秘,拯救你的重要数据
我们的生活和工作越来越离不开各种存储设备,其中优盘因其小巧便携、方便使用的特点,成为了我们存储和传输数据的重要工具之一。为了防止你像我一样会遇到数据丢失抓狂的情况,我分享几款u盘数据恢复软件免费版工具来即时补救。 1.福昕U盘数据…...

Pikachu-Unsafe FileUpload-客户端check
上传图片,点击查看页面的源码, 可以看到页面的文件名校验是放在前端的;而且也没有发起网络请求; 所以,可以通过直接修改前端代码,删除 checkFileExt(this.value) 这部分; 又或者先把文件名改成…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...