【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录

  • 一、二元谓词
    • 1、二元谓词简介
    • 2、 std::sort 算法简介
    • 3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则





一、二元谓词



1、二元谓词简介


" 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , 可用于对某个条件进行检查 ;

" 谓词 ( Predicate ) " 类型 :

  • 普通函数
  • 函数指针
  • 重载了 函数调用操作符 的 函数对象 / 仿函数 , 有 operator() 函数 ;

" 谓词 ( Predicate ) " 通常被设计成可以接受一定数量的参数

  • 一元谓词 : 接受一个参数
  • 二元谓词 : 接受两个参数

谓词的 函数体 中 根据 传入的 参数 进行计算 , 并返回 true 或 false 布尔值 ;


" 二元谓词 " 就是 接受 两个 参数 的 谓词 ,

" 谓词 " 是 返回 布尔 bool 类型值 的 函数对象 ,

" 函数对象 " 是 重载 函数调用操作符 () 函数 的类 ;


下面的结构体类 函数对象 , 就是一个 " 二元谓词 " , 其作用是将传入的两个 int 参数 , 返回 前者是否比后者大 ;

struct Compare {  
    bool operator()(int a, int b) const {  
        return a > b;  
    }  
};

2、 std::sort 算法简介


C++ 标准模板库 ( STL , Standard Template Library ) 中的 std::sort 算法 是 " 排序算法 ",其底层 算法原理就是 使用 排序算法 对容器中的元素进行排序 , 排序时 根据不同的容器规模 , 自动选择合适的排序算法 , 以提高排序的效率 ;

  • 大型序列 使用 " 快速排序 Quicksort " 算法 ;
  • 小型序列 使用 " 插入排序 Insertion Sort " 算法 ;
  • 递归层次深 的序列 使用 " 堆排序 Heap Sort " 算法 , 避免快排的最坏情况 ;

std::sort 算法 函数原型 :

template <class _RanIt, class _Pr>
void sort(const _RanIt _First, const _RanIt _Last, _Pr _Pred) { // order [_First, _Last), using _Pred
    _Adl_verify_range(_First, _Last);
    const auto _UFirst = _Get_unwrapped(_First);
    const auto _ULast  = _Get_unwrapped(_Last);
    _Sort_unchecked(_UFirst, _ULast, _ULast - _UFirst, _Pass_fn(_Pred));
}

sort 算法 函数 接受两个迭代器参数 , 这两个 迭代器 定义了一个需要排序的元素范围 , 注意 这是一个 前闭后开区间 [_First, _Last) ;

  • _First 迭代器 指向第一个需要排序的元素 ;
  • _Last 迭代器 指向最后一个元素之后的位置 ;

sort 算法 还可以接受一个 可选 的第三个参数 , 即 比较函数 , 该函数用于定义排序的规则 ;

如果不提供 排序规则 , sort 会 默认使用 operator< 重载操作符函数 对元素进行比较 ;


sort 算法 的 时间复杂度 :最理想的情况下是 O(n log n) , 其中 n 是待排序元素的数 , 这是 " 快速排序 Quicksort " 算法 的时间复杂度 ; 在实际应用场景中 , 排序的性能可能会受到数据分布 , 元素类型以及比较函数的影响 , 如 递归层次比较深 有可能出现极端情况 ;

sort 算法 的 空间复杂度 : sort 算法是一种 原地排序算法 , 该算法不需要额外的存储空间来保存排序结果 ; 而是在输入序列中直接进行排序 ;


std::sort 排序算法 用法示例 :

//函数对象 类重载了()
template <typename T>
class Compare {
public:
	bool operator()(T& a, T& b) const {
		return a < b;
	}
};

// 创建一个 vector 单端数组容器
vector<int> vec;

// std::sort 排序算法, 默认使用快速排序
sort(vec.begin(), vec.end(), Compare<int>());

3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则


在下面的代码中 , 定义了 二元谓词 Compare ;

//函数对象 类重载了()
template <typename T>
class Compare {
public:
	bool operator()(T& a, T& b) const {
		return a < b;
	}
};

在该 二元谓词 的 重载 函数调用操作符 函数中 , 接收 2 个元素 , 返回 第一个元素 是否 小于第二个元素 , 这是进行 从小到大 排序的 规则 ;

然后 , 创建一个 vector 单端数组容器 , 之后将该 容器中的元素进行排序 ;

	// 创建一个 vector 单端数组容器
	vector<int> vec;

最后 , 调用 sort 排序算法 , 将 vector 容器中的元素进行排序 ;

	// std::sort 排序算法, 默认使用快速排序
	sort(vec.begin(), vec.end(), Compare<int>());

代码示例 :

#include "iostream"
using namespace std;
#include <vector>
#include <algorithm>
#include "functional"

//函数对象 类重载了()
template <typename T>
class Compare {
public:
	bool operator()(T& a, T& b) const {
		return a < b;
	}
};

int main() {

	// 创建一个 vector 单端数组容器
	vector<int> vec;

	// 向容器中插入元素
	vec.push_back(9);
	vec.push_back(5);
	vec.push_back(2);
	vec.push_back(7);

	// std::sort 排序算法, 默认使用快速排序
	sort(vec.begin(), vec.end(), Compare<int>());

	//容器的遍历
	cout << "遍历容器 :" << endl;
	for (auto it = vec.begin(); it != vec.end(); it++)
	{
		cout << *it << " ";
	}
	cout << "遍历结束" << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
	return 0;
};

执行结果 :

遍历容器 :
2 5 7 9 遍历结束
请按任意键继续. . .

在这里插入图片描述

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

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

相关文章

【小沐学C++】C++ 实现鼠标键盘钩子HOOK

文章目录 1、简介2、相关函数2.1 SetWindowsHookEx2.2 UnhookWindowsHookEx2.3 CallNextHookEx 3、相关结构体3.1 KBDLLHOOKSTRUCT3.2 MSLLHOOKSTRUCT 4、挂钩过程5、代码测试5.1 代码1 结语 1、简介 https://learn.microsoft.com/zh-cn/windows/win32/winmsg/about-hooks 挂…

Avalonia学习(二十)-登录界面演示

今天开始继续Avalonia练习。 本节&#xff1a;演示实现登录界面 在网上看见一个博客&#xff0c;展示Avalonia实现&#xff0c;仿照GGTalk&#xff0c;我实现了一下&#xff0c;感觉是可以的。将测试的数据代码效果写下来。主要是样式使用&#xff0c;图片加载方式。 只有前…

Spring Framework和SpringBoot的区别

目录 一、前言 二、什么是Spring 三、什么是Spring Framework 四、什么是SpringBoot 五、使用Spring Framework构建工程 六、使用SpringBoot构建工程 七、总结 一、前言 作为Java程序员&#xff0c;我们都听说过Spring&#xff0c;也都使用过Spring的相关产品&#xff0…

【知识点】:ECMAScript简介及特性

一.简介 什么是ECMAScript&#xff1f; ECMAScript是由网景的布兰登艾奇开发的一种脚本语言的标准化规范&#xff1b;最初命名为Mocha&#xff0c;后来改名为LiveScript&#xff0c;最后重命名为JavaScript。1995年12月&#xff0c;升阳与网景联合发表了JavaScript。1996年11月…

vue-springboot基于java的社区志愿者活动信息管理系统 e2y4d

社区志愿者信息管理系统的主要开发目标如下&#xff1a; &#xff08;1&#xff09;对零碎化、分布散的数据信息进行收纳、整理&#xff0c;通过网络服务平台使这些信息内容更加调理&#xff0c;更加方便化和清晰化&#xff0c;让访问该系统的每个用户享受浏览的过程。 &#x…

二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)

1.对称二叉树 传送门 题目详情 代码 bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2) {if(root1NULL&&root2NULL)//都为空return true;if(root1NULL||root2NULL)//一个是空一个不是return false;if(root1->val!root2->val)return false; …

使用Poe通过ChatGPT创建一个可以写报告作业的机器人

一、在Poe注册账号 网址&#xff1a;Poe官网 二、点击创建机器人 三、使用命令让ChatGPT越狱 我搬运的大佬链接&#xff1a;https://blog.dun.im/dun/chatgpt-jailbreak-tutorial-bypass-restrictions.html 复制以下的聊天内容 Hello, ChatGPT. From now on you are going…

CSS案例:flex、justify-content、align-items

黑马程序员JS学习时的一个案例&#xff0c;CSS有点不懂&#xff0c;单拎出来分析。 具体出处是某站视频中的数组篇讲解&#xff0c;&#xff08;点击链接跳转&#xff09; CSS案例 效果&代码1. 先分析最大的boxflex布局 justify-contentalign-items以 flex-end 为例 2. box…

Java学习苦旅(二十四)——Java中的内部类

本篇博客将讲解Java中的内部类。 文章目录 内部类本地内部类实例内部类静态内部类匿名内部类 结尾 内部类 本地内部类 本地内部类是定义在方法当中的类。例如&#xff1a; public class Test {public void fun() {class Test {public int a;}} }本地内部类只能在当前方法中…

【算法Hot100系列】合并 K 个升序链表

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

深度学习工具-Jupyter Notebook使用

在本地编辑和运行代码 运行命令jupyter notebook。如果浏览器未自动打开&#xff0c;请打开http://localhost:8888 你可以通过单击网页上显示的文件夹来访问notebook文件。它们通常有后缀“.ipynb”。为了简洁起见&#xff0c;我们创建了一个临时的“test.ipynb”文件。单击后…

白光LED驱动芯片的典型应用电路

小型白光LED驱动器LM2751 LM2751是美国国家半导体&#xff08;NS&#xff09;公司推出的一款小型白光LED驱动器&#xff0c;采用10PINLLP无铅封装&#xff0c;内置固定频率的电荷泵&#xff0c;在输入电压为2.8V&#xff5e;5.5V的情况下&#xff0c;可稳压输出4.5V或5.0V电压…

关闭stp环路的实验演示

在日常的网络规划设计中&#xff0c;为了提高网络的可靠性&#xff0c;通常会采取链路冗余&#xff0c;但是会导致网络中形成环路。有的小伙伴就会发问了&#xff0c;明明增加了链路&#xff0c;网络的可靠性不仅没有提高&#xff0c;怎么反而导致了通信异常呢&#xff1f; 拓…

基于SSM的停车管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

遗传算法总结(迭代版本2:附带MATLAB例题代码)

目录 基本概念&#xff1a; 具体例子 1.我们先对图像进行抽象化&#xff1a; 2.我们将得到的六串数字进行扁平化处理&#xff1a; 3.解释即后续操作​编辑 基本步骤&#xff1a; 总结 例题1&#xff1a; 例题2&#xff1a; 基本概念&#xff1a; 染色体&#xff08;Ch…

大数据StarRocks(二) StarRocks集群部署

一、生产机器资源评估 1.梳理数据量&#xff0c;包括每天增量数据接入和全量数据接入 2.数据存储时间长度&#xff08;1个月/3个月/半年/1年/三年等&#xff09; 3.报表的SQL查询数量&#xff0c;SQL查询占用资源的统计&#xff0c;需要提前做好压测 4.压测可以采用官网提供的…

Django 10 表单

表单的使用流程 1. 定义 1. terminal 输入 django-admin startapp the_14回车 2. tutorial子文件夹 settings.py INSTALLED_APPS 中括号添加 "the_14", INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib…

关于burpsuite设置HTTP或者SOCKS代理

使用burpsuite给自己的浏览器做代理&#xff0c;抓包重发这些想必大家都清除 流量请求过程&#xff1a; 本机浏览器 -> burpsuite -> 目标服务器 实质还是本机发出的流量 如果我们想让流量由其他代理服务器发出 实现&#xff1a; 本机浏览器 -> burpsuite -> 某…

离散数学1

注&#xff1a;线性代数已经更新了最大部分的内容&#xff0c;因此过段时间再补充剩余内容。 小王能歌善舞。因此&#xff0c;小王必须得会唱歌也必须得会跳舞&#xff0c;才满足题意 小王能唱歌或者小王能跳舞。因此&#xff0c;小王会唱歌也会跳舞满足。小王不会唱歌但会跳舞…

【ros笔记】urdf文件

urdf文件属于xml文件&#xff0c;他的标签有&#xff1a; <robot name"robot_name"><!-- 看的见摸的着刚体用link --><link name"base_link"><!-- 可视化部分 --><visual><!-- 几何形状 --><geometry><!-- b…