c++STL系列——(十一)常用算法

目录

引言

一、排序

二、搜索

三、转换

四、比较

五、合并

总结


引言

本文将介绍C++ STL中最常用的算法,包括排序、搜索、转换、比较、合并等。我们将逐一介绍这些算法,并提供示例代码以便更好地理解每个算法的用法。

一、排序

排序是STL中最常用的算法之一,它可以将容器中的元素按升序或降序排列。STL提供了几种不同的排序算法,包括快速排序、堆排序、归并排序等。

以下是STL中的常见排序算法:

  • std::sort:使用快速排序算法进行排序。
  • std::stable_sort:使用归并排序算法进行排序,保持相等元素的相对顺序不变。
  • std::partial_sort:部分排序算法,可以将前n个元素排序,而后面的元素则不需要排序。
  • std::nth_element:找到第n个元素。该算法使用快速排序的一部分来实现,因此比完整的快速排序更快。

以下是一个简单的示例代码,演示了如何使用std::sort进行排序:

#include <algorithm>
#include <vector>
#include <iostream>int main()
{std::vector<int> v{ 5, 2, 3, 1, 4 };std::sort(v.begin(), v.end()); // sort the vectorfor (auto i : v) {std::cout << i << ' '; // print out the sorted vector}return 0;
}

输出结果:1 2 3 4 5

二、搜索

搜索算法可以在STL中用于在容器中查找元素。STL提供了几种不同的搜索算法,包括二分搜索、线性搜索等。

以下是STL中的常见搜索算法:

  • std::binary_search:使用二分搜索算法来查找元素。
  • std::find:使用线性搜索算法来查找元素。
  • std::lower_bound / std::upper_bound:使用二分搜索算法在有序容器中查找元素。lower_bound返回第一个大于或等于指定值的元素,而upper_bound返回第一个大于指定值的元素。

以下是一个简单的示例代码,演示了如何使用std::find进行线性搜索:

#include <algorithm>
#include <vector>
#include <iostream>int main()
{std::vector<int> v{ 5, 2, 3, 1, 4 };auto it = std::find(v.begin(), v.end(), 3); // find the element 3if (it != v.end()) {std::cout << "Found element: " << *it << '\n'; // print out the found element}else {std::cout << "Element not found\n";}return 0;
}

输出结果:Found element: 3

三、转换

STL中的转换算法可用于执行各种转换,例如将元素从一种容器类型转换为另一种容器类型。这些算法还可以用于将容器中的元素映射到新的值。

以下是STL中的常见转换算法:

  • std::transform:使用一元或二元函数将一个容器中的元素映射到新的值。可以使用此算法来在两个容器之间执行转换。
  • std::copy:将一个容器的元素复制到另一个容器中。可以使用此算法来将元素从一个容器类型转换为另一个容器类型。

以下是一个简单的示例代码,演示了如何使用std::transform将一个容器中的元素映射到新的值:

#include <algorithm>
#include <vector>
#include <iostream>int main()
{std::vector<int> v{ 1, 2, 3, 4, 5 };std::vector<int> v2(v.size());std::transform(v.begin(), v.end(), v2.begin(), [](int x) { return x * x; }); // square every element in v and store the result in v2for (auto i : v2) {std::cout << i << ' '; // print out the squared vector}return 0;
}

输出结果:1 4 9 16 25

四、比较

STL中的比较算法可用于执行各种比较操作,例如比较两个容器中的元素或查找最大/最小值。

以下是STL中的常见比较算法:

  • std::equal:比较两个容器是否相等。
  • std::max / std::min:返回容器中的最大或最小元素。
  • std::lexicographical_compare:比较两个容器的字典序。该算法将两个容器逐个元素进行比较,直到找到不同的元素为止。

以下是一个简单的示例代码,演示了如何使用std::max返回容器中的最大值:

#include <algorithm>
#include <vector>
#include <iostream>int main()
{std::vector<int> v{ 1, 2, 3, 4, 5 };auto max_elem = std::max_element(v.begin(), v.end()); // find the maximum elementstd::cout << "Maximum element: " << *max_elem << '\n'; // print out the maximum elementreturn 0;
}

输出结果:Maximum element: 5

五、合并

STL中的合并算法可用于将两个已排序的容器合并为一个已排序的容器。

以下是STL中的常见合并算法:

  • std::merge:将两个已排序的容器合并为一个已排序的容器。

以下是一个简单的示例代码,演示了如何使用std::merge将两个已排序的容器合并为一个已排序的容器:

#include <algorithm>
#include <vector>
#include <iostream>int main()
{std::vector<int> v1{ 1, 3, 5 };std::vector<int> v2{ 2, 4, 6 };std::vector<int> merged(v1.size() + v2.size());std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), merged.begin()); // merge the two vectorsfor (auto i : merged) {std::cout << i << ' '; // print out the merged vector}return 0;
}

输出结果:1 2 3 4 5 6

总结

上述算法只是STL中的一部分。本文提供了一些常用的算法示例,以便更好地了解这些算法的实现和用法。在实际编程中,可以根据实际需求选择适当的算法。

需要注意的是,STL中的许多算法都要求容器中的元素是可比较的,因此需要定义比较函数或使用默认比较函数。另外,STL中的许多算法都要求容器是已排序的,因此需要使用排序算法进行排序。

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

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

相关文章

计算机设计大赛 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

Vue的双向绑定数据的原理

vue.js 则是采⽤数据劫持结合发布者-订阅者模式的⽅式&#xff0c;通过 Object.defineProperty() 来劫持各个属性的 setter &#xff0c; getter &#xff0c;在数据变动时发布消息给订阅者&#xff0c;触发相应的监听回调。 Vue的双向绑定数据的原理是基于 数据劫持和发布者-订…

盐构造基本特征

通过实验室实验和现场观察可以推断天然岩盐的粘度。实验中的蠕变定律表明&#xff0c;给定岩性的粘度主要取决于&#xff08;1&#xff09;颗粒大小&#xff0c;&#xff08;2&#xff09;差异应力和&#xff08;3&#xff09;温度&#xff08;van Keken等&#xff0c;1993年&a…

学习总结17

# 无线通讯网 ## 题目描述 国防部计划用无线网络连接若干个边防哨所。2 种不同的通讯技术用来搭建无线网络&#xff1b; 每个边防哨所都要配备无线电收发器&#xff1b;有一些哨所还可以增配卫星电话。 任意两个配备了一条卫星电话线路的哨所&#xff08;两边都有卫星电话&…

一览大模型长文本能力

前言 如今的大模型被应用在各个场景&#xff0c;其中有些场景则需要模型能够支持处理较长文本的能力(比如8k甚至更长)&#xff0c;其中已经有很多开源或者闭源模型具备该能力比如GPT4、Baichuan2-192K等等。 那关于LLM的长文本能力&#xff0c;目前业界通常都是怎么做的&…

2024年腾讯云4核8G12M服务器性能测评,适合哪些使用场景?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

阿里云BGP多线精品EIP香港CN2线路低时延,价格贵

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

mac安装docker-compose

下载资源 **下载地址&#xff1a;**https://github.com/docker/compose/releases 下载docker-compose-linux-aarch64文件 将下载的文件放入指定的目录 mv docker-compose-linux-aarch64 /Users/tyyc/docker将文件名修改成docker-compose mv docker-compose-linux-aarch64 dock…

【LeetCode】134. 加油站(中等)——代码随想录算法训练营Day33

题目链接&#xff1a;134. 加油站 题目描述 在一条环路上有 n 个加油站&#xff0c;其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车&#xff0c;从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发&#xff0c;开始时…

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babe…

jmeter遇到连接数据库的问题

jmeter连接mysql或者oracle简单&#xff0c;但是连接过inceptor吗&#xff1f; 上货 1、下载驱动inceptor 5.1.2.jar包 2、在添加驱动那里导入 3、在JBC request中的写法 PS:没什么可说的

【C++】类和对象(五)友元、内部类、匿名对象

前言&#xff1a;前面我们说到类和对象是一个十分漫长的荆棘地&#xff0c;今天我们将走到终点&#xff0c;也就是说我们对于&#xff23;算是正式的入门了。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &…

[AIGC] Java 和 Kotlin 的区别

好的&#xff0c;我还是以“萌萌哒小码农”的身份继续回答您的问题。 Java 和 Kotlin 是两种不同的编程语言&#xff0c;它们有许多共同点&#xff0c;但也有一些重要的区别。以下是一些常见的 Java 和 Kotlin 的区别&#xff1a; 语法 Kotlin 的语法比 Java 简洁得多&#…

定点数,定点数二维向量,定点数三维向量,定点数数学类

定点数&#xff0c;定点数二维向量&#xff0c;定点数三维向量&#xff0c;定点数数学类 介绍浮点数定点数封装的定点数FixedNumber定点数二维向量定点数三维向量定点数数学类总结 介绍 众所周知定点数是用于做帧同步时保持不同cpu不同设备保持一致稳定的代替浮点数的变量&…

OpenMV学习笔记

一、感光元件----sensor sensor.reset() ----初始化感光元件 sensor.reset() 的功能包括&#xff1a; 初始化感光元件&#xff1a; 将摄像头感光元件初始化为默认状态&#xff0c;以确保其处于可用的工作状态。 恢复默认设置&#xff1a; 将摄像头的其他配置参数还原为默认…

嵌入式中全面解析 SPI 通信协议方法

SPI 的英文全称为 Serial Peripheral Interface&#xff0c;顾名思义为串行外设接口。SPI 是一种同步串行通信接口规范&#xff0c;主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发&#xff0c;后发展成了行业规范。 SPI 是一种高速的、全双工的…

算法沉淀——优先级队列(堆)(leetcode真题剖析)

算法沉淀——优先级队列 01.最后一块石头的重量02.数据流中的第 K 大元素03.前K个高频单词04.数据流的中位数 优先队列&#xff08;Priority Queue&#xff09;是一种抽象数据类型&#xff0c;它类似于队列&#xff08;Queue&#xff09;&#xff0c;但是每个元素都有一个关联的…

嵌入式Linux平台大文件生成以及处理方法

在日常工作中&#xff0c;为了验证某些场景下的功能&#xff0c;经常需要人为构造一些大文件进行测试&#xff0c;有时需要用大文件来测试下载速度&#xff0c;有时需要用大文件来覆盖磁盘空间&#xff1b;偶尔会看到一些网络博文会教大家如何构造大文件&#xff1b;但是当需要…

英伟达(NVIDIA)和CUDA

英伟达&#xff08;NVIDIA&#xff09;是一家知名的图形处理器&#xff08;GPU&#xff09;制造公司&#xff0c;而CUDA则是NVIDIA推出的一种并行计算架构和编程模型。CUDA全称为Compute Unified Device Architecture&#xff0c;即计算统一设备架构&#xff0c;它允许开发者使…

43. C++ 指针合集

C/C指针合集 1. 指针变量的空间大小 指针变量的空间大小是固定值&#xff08;64位下为8字节&#xff0c; 32位下为4字节&#xff09;&#xff0c;跟其指向的数据类型及多级指针无关&#xff0c;与编译平台相关&#xff08;指针大小由当前CPU运行模式的寻址位数决定&#xff0…