C++之STL的algorithm(6)之排序算法(sort、merge)整理

C++之STL的algorithm(6)之排序算法(sort、merge)整理

注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构


C++ 的排序算法整理

  • C++之STL的algorithm(6)之排序算法(sort、merge)整理
  • 一、排序算法
    • 1、sort算法
    • 2、random_shuffle 随机洗牌算法
    • 3、reverse 反转算法
    • 4、 merge 合并算法
  • 总结:


提示:本文为 C++ 中sort、reverse、merge 的写法和举例


一、排序算法

1、sort算法

std::sort 是对一个容器的给定范围内进行排序的算法。

语法:

template<class RandomIt>  
void sort(RandomIt first, RandomIt last);

参数:

first, last:要排序的序列的迭代器范围。

返回:

无返回值,直接修改输入的序列。

对vector 排序示例:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> v = {5, 2, 4, 1, 3};  std::sort(v.begin(), v.end());  for (int i : v) {  std::cout << i << ' ';  }  // 输出: 1 2 3 4 5  return 0;  
}

对于map/set
由于 std::map 和 std::set 内部的元素已经是排序的,所以通常不需要调用 std::sort。但如果你想要基于某个不同的标准来排序它们的元素,你需要复制元素到一个新的容器中(比如 std::vector),然后使用 std::sort。

2、random_shuffle 随机洗牌算法

std::random_shuffle 用于打乱给定序列中元素的顺序。

语法:

template<class RandomIt>  
void random_shuffle(RandomIt first, RandomIt last);

参数:
first, last:要打乱顺序的序列的迭代器范围。

返回:

无返回值,直接修改输入的序列。

vector 示例:

#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <ctime>  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  std::srand(std::time(0)); // 设置随机种子  std::random_shuffle(v.begin(), v.end());  for (int i : v) {  std::cout << i << ' ';  }  // 输出: 随机排列的1到5  return 0;  
}

注意:std::random_shuffle 在 C++17 中被弃用,推荐使用 <random> 库中的函数来生成随机数,从而进行洗牌。

3、reverse 反转算法

std::reverse 用于反转给定序列中元素的顺序。

语法:

template<class BidirectionalIt>  
void reverse(BidirectionalIt first, BidirectionalIt last);

参数:

first, last:要反转的序列的双向迭代器范围。

返回:

无返回值,直接修改输入的序列。

vector 示例:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> v = {1, 2, 3, 4, 5};  std::reverse(v.begin(), v.end());  for (int i : v) {  std::cout << i << ' ';  }  // 输出: 5 4 3 2 1  return 0;  
}

对map/set 示例:
std::map 和 std::set 是基于红黑树的关联容器,因此它们的元素始终是按键排序的。你不能直接反转 map 或 set 的元素顺序,因为它们不允许随机访问迭代器。但是可以复制它们的元素到一个可以反转的容器(比如 std::vector),然后反转那个容器。

这里是一个反转 map 中元素顺序的示例:

#include <iostream>  
#include <map>  
#include <vector>  
#include <algorithm>  int main() {  std::map<int, std::string> m = {{1, "one"}, {2, "two"}, {3, "three"}};  std::vector<std::pair<int, std::string>> v(m.begin(), m.end());  std::reverse(v.begin(), v.end());  for (const auto& pair : v) {  std::cout << pair.second << ": " << pair.first << '\n';  }  // 输出: three: 3  //        two: 2  //        one: 1  return 0;  
}

在这个例子中,我们首先创建了一个 std::map,然后将它的元素复制到一个 std::vector 中。之后,我们使用 std::reverse 来反转 vector 中的元素顺序,并打印出反转后的结果。

4、 merge 合并算法

std::merge 是用于合并两个已排序的(容器)到第三个范围(目标容器)的算法。

template<class InputIt1, class InputIt2, class OutputIt>  
OutputIt merge(InputIt1 first1, InputIt1 last1,  InputIt2 first2, InputIt2 last2,  OutputIt d_first);

参数:

first1, last1:第一个输入序列的迭代器范围。
first2, last2:第二个输入序列的迭代器范围。
d_first:目标序列的起始迭代器。

返回:

返回指向目标序列中最后一个元素的下一个位置的迭代器。

vector 示例:

#include <iostream>  
#include <vector>  
#include <algorithm>  int main() {  std::vector<int> v1 = {1, 3, 5};  std::vector<int> v2 = {2, 4, 6};  std::vector<int> v3(v1.size() + v2.size());  std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());  for (int i : v3) {  std::cout << i << ' ';  }  // 输出: 1 2 3 4 5 6  return 0;  
}

注意:std::merge 也不适用于 std::map 和 std::set,因为它们已经是排序好的容器,并且它们的元素不能直接合并到另一个 map 或 set 中。

总结:

std::sort 用于对序列进行排序。
std::random_shuffle(已弃用)用于打乱序列中元素的顺序。
std::reverse 则用于反转序列中元素的顺序。
std::merge 适用于合并两个已排序的序列。

对于 map 和 set 这样的关联容器,由于它们的元素是按键排序的,通常不直接在这些容器上进行排序或反转操作,而是将它们的元素复制到可以能够执行这些操作的vector容器中。

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

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

相关文章

Oracle数据库——分组函数四

12.1什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值。例如求平均数,最大值等等。 1.组函数类型 AVG :求平均数COUNT :COUNT(expr) 返回expr不为空的记录总数。 MAX 求最大值MIN

【简单讲解下WebSocket】

&#x1f308;个人主页:程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

Vue探索之Vue2.x源码分析(一)

一.响应式数据之数组的处理 <template><div><ul><li v-for"(item, index) in items" :key"index">{{ item }}<button click"removeItem(index)">Remove</button></li></ul><input v-model&…

Python卷积网络车牌识别系统(V2.0)

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

基于单片机的无线红外报警系统

**单片机设计介绍&#xff0c;基于单片机的无线红外报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的无线红外报警系统是一种结合了单片机控制技术和无线红外传感技术的安防系统。该系统通过无线红外传感器实…

SpringBoot -- 外部化配置

我们如果要对普通程序的jar包更改配置&#xff0c;那么我们需要对jar包解压&#xff0c;并在其中的配置文件中更改配置参数&#xff0c;然后再打包并重新运行。可以看到过程比较繁琐&#xff0c;SpringBoot也注意到了这个问题&#xff0c;其可以通过外部配置文件更新配置。 我…

鸿蒙系统前端:构建智能互联新时代的界面之美

随着华为鸿蒙系统的推出&#xff0c;前端技术也迎来了新的挑战与机遇。鸿蒙系统&#xff0c;作为华为自主研发的分布式操作系统&#xff0c;旨在打通各类智能设备&#xff0c;为用户提供一个无缝的智能互联体验。在这个宏大的愿景下&#xff0c;鸿蒙系统的前端设计显得尤为重要…

Java作业练习_第六周作业多态性(小白学习记录,仅供参考,有错指出)

题目排序&#xff08;点击直达&#xff09; 第一题第二题第三题第四题第五题第六题第七题第八题免责声明 第一题 写出下列程序的运行结果&#xff1a; package com.cxl.ch5.demo5; public class Base {int m0;public int getM(){return m;} } package com.cxl.ch5.demo5;publ…

第18章 JDK8-17新特性

1. Java版本迭代概述 1.1 发布特点&#xff08;小步快跑&#xff0c;快速迭代&#xff09; 发行版本发行时间备注Java 1.01996.01.23Sun公司发布了Java的第一个开发工具包Java 5.02004.09.30①版本号从1.4直接更新至5.0&#xff1b;②平台更名为JavaSE、JavaEE、JavaMEJava 8…

复杂度的讲解

1.算法效率 如何衡量一个算法的好坏&#xff1f;从两个维度&#xff0c;时间和空间&#xff08;算法运行的快慢&#xff0c;消耗的空间大不大&#xff09;。因为计算机硬件领域的高速发展&#xff0c;如今计算机的存储量已经达到了一个很高的程度&#xff0c;所以现在我们一般…

代码随想录算法训练营DAY15|C++二叉树Part.2|102.二叉树的层序遍历、226.翻转二叉树、101. 对称二叉树

文章目录 102.二叉树的层序遍历思路伪代码迭代法递归法 CPP代码拓展题 226.翻转二叉树思路CPP代码 101. 对称二叉树伪代码CPP代码 102.二叉树的层序遍历 力扣题目链接 文章讲解&#xff1a;102.二叉树的层序遍历 视频讲解&#xff1a;讲透二叉树的层序遍历 | 广度优先搜索 | Le…

微信公众号如何开通留言功能?

首先&#xff0c;我们需要了解为什么现在注册的公众号没有留言功能。这是因为所有在2018年之后注册的微信公众号都无法再自带留言功能。这一变化是根据微信的通知而实施的。自2018年2月12日起&#xff0c;微信对新注册的公众号进行了调整&#xff0c;取消了留言功能。这一决策主…

MySQL - 基础二

6、表的增删改查 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 6.1、Create 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)]VALUES (value_list) [, (value_list)] ...value_list: v…

static关键字总结

static关键字的使用1. static: 静态的2. static 用来修饰的结构&#xff1a;属性、方法; 代码块、内部类&#xff1b;3. static修饰属性3.1 复习&#xff1a;变量的分类方式1&#xff1a;按照数据类型&#xff1a;基本数据类型、引用数据类型方式2&#xff1a;按照类中声明的位…

第十四届省赛大学B组(C/C++)子串简写

原题链接&#xff1a;子串简写 程序猿圈子里正在流行一种很新的简写方法&#xff1a; 对于一个字符串&#xff0c;只保留首尾字符&#xff0c;将首尾字符之间的所有字符用这部分的长度代替。 例如 internationalization 简写成 i18n&#xff0c;Kubernetes 简写成 K8s&#…

Java基础知识总结(37)

JUC容器 JUC基于非阻塞算法&#xff08;Lock Free 无锁编程&#xff09;提供了一组高并发的List、Set、Queue、Map容器。 JUC高并发容器是基于非阻塞算法实现的容器类&#xff0c;无锁编程算法主要通过CAS&#xff08;Compare And Swap&#xff09;volatile的组合实现&#x…

【SaaS,PaaS? XaaS -微参考】

介绍 以下是关于各种云服务模式的简要介绍&#xff0c;包括全称、定义、典型场景和应用&#xff1a; 缩写全称定义关键词典型场景和应用SaaSSoftware as a Service将软件以服务的形式交付给用户&#xff0c;用户通过互联网访问软件。提供软件电子邮件、在线办公套件&#xff…

JavaAPI操作HBase-Day2

Java代码操作HBase pom依赖,依赖版本要和软件一致 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.5.5</version></dependency><dependency>…

android 14 apexd分析(1)apexd bootstrap

Apex的由来&#xff0c;我们都知道普通的apk我们可以通过应用商店playstore等进行更新&#xff0c;apex的引入是google希望也能通过playstore更新bin文件.so etc配置文件等类型文件. 这些文件的安装实际通过apexd来进行&#xff0c;现在我们来解析一下apexd&#xff0c; apexd的…

JAVAEE——文件IO之文件操作

文章目录 文件的创建和销毁File概述构造方法常用的方法getAbsolutePath()exists()isDirectory()isFile()createNewFile()delete()deleteOnExit()list()listFiles()mkdir() 文件的创建和销毁 上面我们介绍了文件的读写操作那么文件的创建等的操作如何进行呢&#xff1f;这个操作…