algorithm中常见算法

1、前言

      C++的<algorithm>库是C++标准库中的一个重要组成部分,它提供了一系列的函数,用于执行各种常见的算法操作,比如排序、查找、替换、合并等。这些算法函数通常以模板函数的形式提供,可以用于任何符合特定条件的容器类型。

2、常见用法举例

      下面结合点云数据处理中常用的算法,介绍该库中一些常用函数。

2.1 最大值与最小值获取

      <algorithm>库提供了min_elementmax_element函数,这些函数用于在给定范围内查找最小值和最大值元素。这两个函数都返回一个迭代器,指向范围内最小或最大元素的第一个实例。如下,为一个数组vec,使用上面两个函数,获取该数组的最大值与最小值。同时,其提供的max()、min()函数,可以比较两个数大小。

#include <algorithm> // 包含算法库
#include <vector>
#include <iostream>
using namespace std;

//获取最大值与最小值
int main()
{
	std::vector<int> vec = { 5, 3, 9, 1, 4, 10, 0, 0 };

	// 找到最小元素的迭代器
	auto min_it = std::min_element(vec.begin(), vec.end());
	std::cout << "最小元素: " << *min_it << std::endl;

	// 找到最大元素的迭代器
	auto max_it = std::max_element(vec.begin(), vec.end());
	std::cout << "最大元素: " << *max_it << std::endl;

	cout << std::max(30, 18) << endl;

	cout << std::min(30, 18) << endl;

	system("pause");

	return 0;
}

 2.2 数组排序

      <algorithm>库提供了sort函数用于对容器内的元素进行排序,而reverse函数用于将容器内的元素顺序颠倒。这两个函数经常一起使用,以满足不同的排序需求。注意,第一次使用sort,其对容器内元素进行升序排序,再使用一次,则是降序排序。另外,使用reverse时,其将容器颠倒过来。如果reverse之前是升序,那么操作reverse后变为降序;若reverse之前为降序,那么reverse之后为升序。

#include <iostream>
#include <vector>
#include <algorithm> // 引入sort和reverse函数

int main() {
	std::vector<int> numbers = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };

	// 升序排序
	std::sort(numbers.begin(), numbers.end());
	std::cout << "升序排序后的数组: ";
	for (int num : numbers) {
		std::cout << num << " ";
	}
	std::cout << std::endl;

	// 降序排序
	std::sort(numbers.rbegin(), numbers.rend());
	std::cout << "降序排序后的数组: ";
	for (int num : numbers) {
		std::cout << num << " ";
	}
	std::cout << std::endl;

	// 颠倒顺序
	std::reverse(numbers.begin(), numbers.end());
	std::cout << "颠倒顺序后的数组: ";
	for (int num : numbers) {
		std::cout << num << " ";
	}
	std::cout << std::endl;
	system("pause");

	return 0;
}

      初始容器无序,经过sort()处理后,变为升序,也就是sort()默认是进行升序处理。后面再进行sort()处理,变为降序处理。降序处理后,经过reverse()处理后,又变为升序。因此,其实可以使用两次sort()达到降序目的。

2.3 查找

      使用 std::find() 算法可以查找容器中第一次出现指定值的元素。如下,给出一个数组,里面包含多个5,但其只返回第一次出现5的索引号,即4。

#include <iostream>
#include <vector>
#include <algorithm> // 引入 std::find

int main() {
	std::vector<int> numbers = { 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5 };

	// 查找值 5
	auto it = std::find(numbers.begin(), numbers.end(), 5);

	if (it != numbers.end()) {
		std::cout << "找到值 " << *it << " 在位置: " << std::distance(numbers.begin(), it) << std::endl;
	}
	else {
		std::cout << "未找到值 5" << std::endl;
	}
	system("pause");

	return 0;
}

2.4 删除操作

2.4.1 删除指定索引位置元素     

      在数据处理中,经常有删除指定索引位置处的元素,如下代码,将索引为2,对应的元素3删掉,后续容器中只有1、2、4、5

#include <iostream>
#include <vector>

int main() {
	std::vector<int> vec = { 1, 2, 3, 4, 5 };
	size_t index_to_erase = 2; // 假设我们要删除索引为2的元素,即3

	if (index_to_erase < vec.size()) {
		vec.erase(vec.begin() + index_to_erase);
	}

	// 打印结果
	std::cout << "Vector after erasing element at index " << index_to_erase << ": ";
	for (int num : vec) {
		std::cout << num << " ";
	}
	std::cout << std::endl;
	system("pause");

	return 0;
}

2.4.2 删除指定值元素

      有时候,需要删除指定元素值,如下,对于原始容器,希望将元素值为3的所有元素删除。

#include <iostream>
#include <algorithm>
#include<vector>

int main() {
	std::vector<int> arr = { 1, 2, 3, 4, 3, 5, 3 };
	int value_to_remove = 3;

	// 使用 remove 将值移动到数组开头,返回最后一个有效元素的指针
	std::vector<int>::iterator new_end = std::remove(arr.begin(), arr.end(), value_to_remove);

	// 使用 erase 移除不再使用的元素
	arr.erase(new_end, arr.end());

	// 打印结果
	std::cout << "Array after removing value " << value_to_remove << ": ";
	for (std::vector<int>::iterator it = arr.begin(); it != arr.end(); ++it) {
		std::cout << *it << " ";
	}
	std::cout << std::endl;
	system("pause");

	return 0;
}

3、总结

      介绍了algorithm中常见的被点云数据处理中,涉及到的算法函数接口,合理利用可以简化程序复杂度。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SaaS技术解析:如何构建高效、安全的软件即服务解决方案

摘要&#xff1a;随着云计算技术的飞速发展&#xff0c;软件即服务&#xff08;Software as a Service&#xff0c;简称SaaS&#xff09;作为一种新兴的软件应用模式&#xff0c;正逐渐改变着企业信息化的格局。本文将对SaaS技术进行深入解析&#xff0c;探讨如何构建高效、安全…

校园巡礼:一周只上四天课,入学即发钱?深圳理工大学,开局即王炸

校园巡礼 | 一周只上四天课&#xff0c;入学即发钱&#xff1f;深圳理工大学&#xff0c;开局即王炸&#xff01; 会议之眼 快讯 目前各省的高考成绩现已陆续揭晓&#xff0c;广东省教育考试院发布了2024年高考录取最低分数线&#xff0c;物理类本科线为442分&#xff0c;历史…

Rocky Linux设置静态IP

[connection] idens160 uuidcd246f67-c929-362a-809d-f1b44ddc5d25 typeethernet autoconnect-priority-999 interface-nameens160 timestamp1719094243[ethernet][ipv4] ## 在IPV4下面修改如下内容 methodmanual address192.…

科普文:贝叶斯过滤器判定垃圾邮件

简介 贝叶斯分类的运作是借着使用标记(一般是字词&#xff0c;有时候是其他)与垃圾邮件、非垃圾邮件的关连&#xff0c;然后搭配贝叶斯推断来计算一封邮件为垃圾邮件的可能性。 贝叶斯垃圾邮件过滤是非常有威力的技术&#xff0c;可以修改自己以符合个别使用者的需要&#xff0…

pdf压缩,pdf压缩在线,pdf压缩在线网页版

当我们遇到PDF文件过大&#xff0c;需要压缩其容量大小时&#xff0c;通常是为了更方便地传输、存储或分享这些文件。PDF文件的大小可能因其包含的图像、字体等元素的数量和质量而有所不同。下面&#xff0c;我们将详细介绍压缩PDF容量大小的方法&#xff0c;帮助您轻松实现文件…

TikTok短视频矩阵系统

随着数字化时代的到来&#xff0c;短视频已成为人们获取信息、娱乐消遣的重要渠道。TikTok&#xff0c;作为全球最受欢迎的短视频平台之一&#xff0c;其背后的短视频矩阵系统是支撑其成功的关键因素。本文将深入探讨TikTok短视频矩阵系统的构成、功能以及它在新媒体时代中的影…

基于 JuiceFS 构建高校 AI 存储方案:高并发、系统稳定、运维简单

中山大学的 iSEE 实验室&#xff08;Intelligence Science and System) Lab&#xff09;在进行深度学习任务时&#xff0c;需要处理大量小文件读取。在高并发读写场景下&#xff0c;原先使用的 NFS 性能较低&#xff0c;常在高峰期导致数据节点卡死。此外&#xff0c;NFS 系统的…

《Three.JS零基础入门教程》第九篇:环境详解

往期回顾&#xff1a; 《Three.JS零基础入门教程》第一篇&#xff1a;搭建开发环境 《Three.JS零基础入门教程》第二篇&#xff1a;起步案例 《Three.JS零基础入门教程》第三篇&#xff1a;开发辅助 《Three.JS零基础入门教程》第四篇&#xff1a;基础变换 《Three.JS零基…

element-ui侧边栏:default-openeds

element-ui侧边栏实现路由跳转后展开对应侧边栏&#xff1a;default-openeds 当菜单是在本地写死时&#xff0c;如果想展开第一块内容、里面就只写1 :default-openeds"[‘1’]" 当菜单是动态获取时&#xff0c;点击跳转之后如何展开对应的菜单&#xff0c;在watch中监…

三元前驱体废水回收镍钴工艺:环保与经济效益的双重胜利

在全球新能源产业迅猛发展的背景下&#xff0c;锂离子电池作为绿色能源的核心组件&#xff0c;其需求量激增&#xff0c;带动了上游材料市场&#xff0c;尤其是三元前驱体材料的蓬勃发展。然而&#xff0c;伴随着行业的快速扩张&#xff0c;三元前驱体生产过程中产生的含镍钴废…

嘉绩咨询低成本连锁品牌招商全案陪跑赋能中小品牌有效招商

以企业战略导航为基石&#xff0c;致力于构建全面招商生态系统的嘉绩咨询&#xff0c;今天宣布推出面向中小品牌的低成本连锁招商全案陪跑服务。这项创新服务是为了帮助具有潜力的中小品牌在市场中迅速构建渠道&#xff0c;通过有效招商策略促进成长。 嘉绩咨询凭借先进的“教育…

PCI认证HSM的特点

PCI认证HSM(硬件安全模块)在支付卡行业中扮演着至关重要的角色&#xff0c;它是确保支付交易数据完整性和机密性的关键组件。以下是关于PCI认证HSM的详细介绍&#xff1a; 一、PCI认证HSM的定义 PCI认证HSM是专门用于支付行业的硬件安全模块&#xff0c;它满足支付卡行业(PCI)的…

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器&#xff0c;定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠&#xff0c;交换物品…

Oracle优化案例-教你在线搞定top cpu的sql(十二)

监控告警阈值load 大于10 SQL如下&#xff0c;太好用了 SELECT A.SQL_ID, A.SESS_COUNT, A.CPU_LOAD, B.SQL_TEXTFROM (SELECT SQL_ID,COUNT(*) SESS_COUNT,ROUND(COUNT(*) / SUM(COUNT(*)) OVER(), 2) CPU_LOADFROM V$ACTIVE_SESSION_HISTORYWHERE SAMPLE_TIME > SYSDATE…

[深度学习] 门控循环单元GRU

门控循环单元&#xff08;Gated Recurrent Unit, GRU&#xff09;是一种用于处理序列数据的递归神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;变体&#xff0c;它通过引入门控机制来解决传统RNN在处理长序列时的梯度消失问题。GRU与长短期记忆网络&#xff0…

反射及动态代理

反射 定义&#xff1a; 反射允许对封装类的字段&#xff0c;方法和构造 函数的信息进行编程访问 图来自黑马程序员 获取class对象的三种方式&#xff1a; 1&#xff09;Class.forName("全类名") 2&#xff09;类名.class 3) 对象.getClass() 图来自黑马程序员 pac…

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序

这一小节&#xff0c;我们说一下前端 js-tool-big-box 这个工具库&#xff0c;添加的数值型数组的正向排序和倒向排序。 以前呢&#xff0c;我们的数组需要排序的时候&#xff0c;都是在项目的utils目录里&#xff0c;写一段公共方法&#xff0c;弄个冒泡排序啦&#xff0c;弄…

JNI详解

JNI简介 Java是跨平台的语言&#xff0c;但在有的时候仍需要调用本地代码&#xff08;这些代码通常由C/C编写的&#xff09;。 Sun公司提供的JNI是Java平台的一个功能强大的接口&#xff0c;JNI接口提供了Java与操作系统本地代码互相调用的功能。 Java调C 1&#xff09;使用…

Spring Boot 学习第八天:AOP代理机制对性能的影响

1 概述 在讨论动态代理机制时&#xff0c;一个不可避免的话题是性能。无论采用JDK动态代理还是CGLIB动态代理&#xff0c;本质上都是在原有目标对象上进行了封装和转换&#xff0c;这个过程需要消耗资源和性能。而JDK和CGLIB动态代理的内部实现过程本身也存在很大差异。下面将讨…

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&am…