algorithm算法库学习之——堆操作,最小/最大操作,比较操作,排列操作

news2025/2/6 0:59:47

algorithm此头文件是算法库的一部分。本篇介绍堆操作,最小/最大操作,比较操作,排列操作。

接口API

堆操作

is_heap

检查给定范围是否为一个最大堆
(函数模板)

is_heap_until

(C++11)

查找能成为最大堆的最大子范围
(函数模板)

make_heap

从一个元素范围创建出一个最大堆
(函数模板)

push_heap

将一个元素加入到一个最大堆
(函数模板)

pop_heap

从最大堆中移除最大元素
(函数模板)

sort_heap

将一个最大堆变成一个按升序排序的元素范围
(函数模板)
最小/最大操作

max

返回各给定值中的较大者
(函数模板)

max_element

返回范围内的最大元素
(函数模板)

min

返回各给定值中的较小者
(函数模板)

min_element

返回范围内的最小元素
(函数模板)

minmax

(C++11)

返回两个元素的较小和较大者
(函数模板)

minmax_element

(C++11)

返回范围内的最小元素和最大元素
(函数模板)
比较操作

equal

确定两个元素集合是否是相同的
(函数模板)

lexicographical_compare

当一个范围按字典顺序小于另一个范围时,返回 true
(函数模板)
排列操作

is_permutation

(C++11)

判断一个序列是否为另一个序列的排列
(函数模板)

next_permutation

产生某个元素范围的按字典顺序的下一个较大的排列
(函数模板)

prev_permutation

产生某个元素范围的按字典顺序的下一个较小的排列
(函数模板)

示例代码:

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <utility>      // std::pair
#include <vector>
#include <array>
#include <cctype>       // std::tolower
#include <string>
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand
#include <random>       // std::default_random_engine
#include <chrono>       // std::chrono::system_clock

#include <iomanip>




bool myfn(int i, int j) { return i < j; }

struct myclass {
	bool operator() (int i, int j) { return i < j; }
} myobj;

bool is_palindrome(const std::string& s)
{
	return std::equal(s.cbegin(), s.cbegin() + s.size() / 2, s.crbegin());
}

void test_equal(const std::string& s)
{
	std::cout << std::quoted(s)
		<< (is_palindrome(s) ? " 是" : " 不是")
		<< "回文\n";
}

// a case-insensitive comparison function:
bool mycomp(char c1, char c2)
{
	return std::tolower(c1) < std::tolower(c2);
}

template<typename Os, typename V>
Os& operator<<(Os& os, const V& v)
{
	os << "{ ";
	for (const auto& e : v)
		os << e << ' ';
	return os << '}';
}

int main()
{
	// make_heap example 从一个元素范围创建出一个最大堆 
	int myints[] = { 10,20,30,5,15 };
	std::vector<int> v(myints, myints + 5);
	std::make_heap(v.begin(), v.end());
	std::cout << "initial max heap   : " << v.front() << '\n';
	
	// pop_heap example 从最大堆中移除最大元素
	std::pop_heap(v.begin(), v.end()); v.pop_back();
	std::cout << "max heap after pop : " << v.front() << '\n';
	
	// push_heap example 将一个元素加入到一个最大堆 
	v.push_back(99); std::push_heap(v.begin(), v.end());
	std::cout << "max heap after push: " << v.front() << '\n';

	// sort_heap example 将一个最大堆变成一个按升序排序的元素范围
	std::sort_heap(v.begin(), v.end());
	std::cout << "final sorted range :";
	for (unsigned i = 0; i < v.size(); i++)
		std::cout << ' ' << v[i];
	std::cout << '\n';

	// is_heap example 检查给定范围是否为一个最大堆 
	std::vector<int> foo{ 9,5,2,6,4,1,3,8,7 };
	if (!std::is_heap(foo.begin(), foo.end()))
		std::make_heap(foo.begin(), foo.end());
	std::cout << "Popping out elements:";
	while (!foo.empty()) {
		std::pop_heap(foo.begin(), foo.end());   // moves largest element to back
		std::cout << ' ' << foo.back();         // prints back
		foo.pop_back();                         // pops element out of container
	}
	std::cout << '\n';

	// is_heap_until example 查找能成为最大堆的最大子范围
	std::vector<int> foo2{ 2,6,9,3,8,4,5,1,7 };
	std::sort(foo2.begin(), foo2.end());
	std::reverse(foo2.begin(), foo2.end());
	auto last = std::is_heap_until(foo2.begin(), foo2.end());
	std::cout << "The " << (last - foo2.begin()) << " first elements are a valid heap:";
	for (auto it = foo2.begin(); it != last; ++it)
		std::cout << ' ' << *it;
	std::cout << '\n';

	// min example 返回各给定值中的较小者
	std::cout << "min(1,2)==" << std::min(1, 2) << '\t';
	std::cout << "min(2,1)==" << std::min(2, 1) << '\t';
	std::cout << "min('a','z')==" << std::min('a', 'z') << '\t';
	std::cout << "min(3.14,2.72)==" << std::min(3.14, 2.72) << '\n';

	// max example 返回各给定值中的较大者 
	std::cout << "max(1,2)==" << std::max(1, 2) << '\t';
	std::cout << "max(2,1)==" << std::max(2, 1) << '\t';
	std::cout << "max('a','z')==" << std::max('a', 'z') << '\t';
	std::cout << "max(3.14,2.73)==" << std::max(3.14, 2.73) << '\n';

	// minmax example 返回两个元素的较小和较大者 
	auto result = std::minmax({ 1,2,3,4,5 });
	std::cout << "minmax({1,2,3,4,5}): ";
	std::cout << result.first << ' ' << result.second << '\n';

	// min_element example 返回范围内的最小元素 
	// max_element example 返回范围内的最大元素 
	int myints2[] = { 3,7,2,5,6,4,9 };
	// using default comparison:
	std::cout << "The smallest element is " << *std::min_element(myints2, myints2 + 7) << '\n';
	std::cout << "The largest element is " << *std::max_element(myints2, myints2 + 7) << '\n';
	// using function myfn as comp:
	std::cout << "The smallest element is " << *std::min_element(myints2, myints2 + 7, myfn) << '\n';
	std::cout << "The largest element is " << *std::max_element(myints2, myints2 + 7, myfn) << '\n';
	// using object myobj as comp:
	std::cout << "The smallest element is " << *std::min_element(myints2, myints2 + 7, myobj) << '\n';
	std::cout << "The largest element is " << *std::max_element(myints2, myints2 + 7, myobj) << '\n';

	// minmax_element example 返回范围内的最小元素和最大元素 
	std::array<int, 7> foo3{ 3,7,2,9,5,8,6 };
	auto result3 = std::minmax_element(foo3.begin(), foo3.end());
	// print result:
	std::cout << "min is " << *result3.first;
	std::cout << ", at position " << (result3.first - foo3.begin()) << '\n';
	std::cout << "max is " << *result3.second;
	std::cout << ", at position " << (result3.second - foo3.begin()) << '\n';

	// equal example 确定两个元素集合是否是相同的 
	test_equal("radar");
	test_equal("hello");

	// lexicographical_compare example 当一个范围按字典顺序小于另一个范围时,返回 true
	char foo5[] = "Apple";
	char bar5[] = "apartment";
	std::cout << std::boolalpha;
	std::cout << "Comparing foo and bar lexicographically (foo<bar):\n";
	std::cout << "Using default comparison (operator<): ";
	std::cout << std::lexicographical_compare(foo5, foo5 + 5, bar5, bar5 + 9);
	std::cout << '\n';
	std::cout << "Using mycomp as comparison object: ";
	std::cout << std::lexicographical_compare(foo5, foo5 + 5, bar5, bar5 + 9, mycomp);
	std::cout << '\n';

	// is_permutation example 判断一个序列是否为另一个序列的排列 
	static auto v1 = { 1, 2, 3, 4, 5 };
	static auto v2 = { 3, 5, 4, 1, 2 };
	static auto v3 = { 3, 5, 4, 1, 1 };

	std::cout << v2 << " 是 " << v1 << " 的排列:" << std::boolalpha
		<< std::is_permutation(v1.begin(), v1.end(), v2.begin()) << '\n'
		<< v3 << " 是 " << v1 << " 的排列:" << std::boolalpha
		<< std::is_permutation(v1.begin(), v1.end(), v3.begin()) << '\n';

	// next_permutation example 产生某个元素范围的按字典顺序的下一个较大的排列 
	int myints6[] = { 1,2,3 };
	std::sort(myints6, myints6 + 3);
	std::cout << "The 3! possible permutations with 3 elements:\n";
	do {
		std::cout << myints6[0] << ' ' << myints6[1] << ' ' << myints6[2] << '\n';
	} while (std::next_permutation(myints6, myints6 + 3));
	std::cout << "After loop: " << myints6[0] << ' ' << myints6[1] << ' ' << myints6[2] << '\n';

	// prev_permutation example 产生某个元素范围的按字典顺序的下一个较小的排列 
	int myints7[] = { 1,2,3 };
	std::sort(myints7, myints7 + 3);
	std::reverse(myints7, myints7 + 3);
	std::cout << "The 3! possible permutations with 3 elements:\n";
	do {
		std::cout << myints7[0] << ' ' << myints7[1] << ' ' << myints7[2] << '\n';
	} while (std::prev_permutation(myints7, myints7 + 3));
	std::cout << "After loop: " << myints7[0] << ' ' << myints7[1] << ' ' << myints7[2] << '\n';

	 
	std::cout << "hello world\n";
	return 0;
}



运行结果:

参考:

https://cplusplus.com/reference/algorithm/

标准库标头 <algorithm> - cppreference.com

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

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

相关文章

SQL 时间盲注 (injection 第十六关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…

C:每日一题:双指针法的使用

前言&#xff1a; 思虑再三&#xff0c;觉得如果有时间每日一题还是可以更新一下的。 题目难度&#xff1a;基础 解题方法&#xff1a;双指针法 一、题目 输入一个整数数组&#xff0c; 实现一个函数来调整该数组中数字的顺序使得 数组中所有的奇数位于数组的前半部分&a…

数字人的形象克隆与语音克隆是伪需求

形象克隆与语音克隆技术&#xff0c;在当前的环境上已经可以成熟的实现&#xff0c;但真的解决了痛点问题吗&#xff1f; 普通人或者一般的公司克隆自己内部人的形象有必要吗&#xff1f;对外界而言&#xff0c;克隆的形象与虚拟的形象并无二致&#xff0c;本身并没有什么知名…

Arduino自制手持小风扇项目

1.1 介绍&#xff1a; 实验功能说明&#xff1a;功能&#xff08;1&#xff09;按一下按键小风扇开启&#xff0c;再按一下关闭。 功能&#xff08;2&#xff09;按一下按键小风扇一档风速&#xff0c;再按一下二挡&#xff0c;依次三挡…关闭。 按键模块说明&#xff1a;按下…

【自动化测试必学语言】python:模块和包

目录 导入模块的语法 方式一 方式二 方式三 【了解】 基本不用 模块的查找顺序 __name__ 的作用 代码练习 包(package) Python 源代码文件就是⼀个模块模块中定义的变量函数类&#xff0c;都可以让别人使用&#xff0c;同样&#xff0c;可以使用别人定义的&#xff08…

进程(2) wait、exec函数族

目录 1. fork() 函数 功能 使用时注意事项 2. exit() 函数 功能 使用时注意事项 3. wait() 函数 功能 使用时注意事项 总结 wait() 异常信号结束 waitpid exec函数族 execl() execlp() execv execvp fork()、exit() 和 wait() 函数在进程管理中扮演着重要的角…

【C语言】【Linux】如何在Linux终端中进行彩色输出——C语言篇

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;C语言编程&…

双亲委派机制的优势与劣势

三次双亲委派机制的破坏

24 优化算法

目录 优化和深度学习深度学习中的挑战局部最小 vs 全局最小鞍点(saddle point)梯度消失小结凸性(convexity)凸集凸函数(convex function)凸函数优化凸和非凸例子小结梯度下降(gradient descent)1、梯度下降算法是最简单的迭代求解算法2、学习率(learning rate)小结随…

Unity小功能 - 贴墙滑行

目录 一. 简介 二. 创建项目 1.新建地板 2.创建墙体 3.创建主角 三. 编写代码 四. 效果演示 五. 总结 一. 简介 贴墙滑行是在游戏中常见的一种角色动作表现&#xff0c;它能够增加游戏的真实感和趣味性&#xff0c;同时也为游戏玩法带来更多的可能性。 在 Unity 中实…

【秋招笔试】8.18大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

测绘程序设计|测绘程序设计大赛介绍|备赛建议

**由于微信公众号改变了推送规则&#xff0c;为了每次新的推送可以在第一时间出现在您的订阅列表中&#xff0c;记得将本公众号设为星标或置顶喔~** 简单介绍测绘学科创新创业智能大赛测绘技能竞赛——测绘程序设计比赛。 &#x1f33f;前言 测绘程序设计比赛是测绘学科创新创…

HTTPS协议和HTTP协议的区别详细图解

文章目录 HTTPS协议加密是什么&#xff1f;对称加密非对称加密 Cookie 和 Session的区别 HTTPS协议 HTTP协议内容都是按照文本的方式明文传输的&#xff0c;是没有经过加密的&#xff0c;没有加密就意味着裸奔&#xff0c;所以协议中的内容就很容易引起一些不良人士的获取和篡…

STM32自制手持小风扇实验

1.1 介绍&#xff1a; 实验功能说明&#xff1a;功能&#xff08;1&#xff09;按一下按键小风扇开启&#xff0c;再按一下关闭。 功能&#xff08;2&#xff09;按一下按键小风扇一档风速&#xff0c;再按一下二挡&#xff0c;依次三挡…关闭。 按键模块说明&#xff1a;按下…

CommandLineRunner

CommandLineRunner 是 Spring Boot 中的一个接口&#xff0c;它允许你在 Spring 应用程序启动之后&#xff08;即在 SpringApplication.run() 执行完成后&#xff09;立即执行一些代码。这在你需要初始化数据、检查配置文件参数或执行其他启动任务时非常有用。 实现 CommandLin…

win10蓝屏CRITICAL_PROCESS_DIED

目录 前言 处理过程 第一阶段处理&#xff1a;重置虚拟内存 第二阶段处理&#xff1a;sfc /scannow 扫描系统并修复损坏文件 前言 连续一周开机一段时间后蓝屏&#xff0c;刚开始的蓝屏提示的是KERNEL_DATA_INPAGE_ERROR&#xff0c;后来经过一番操作&#xff0c;依然出现…

vue使用axios请求后端数据

前后端分离项目的基础&#xff1a; 前后端跨域访问 vite.config.js中加入 // 1.为什么要跨域 //因为浏览器的同源策略,不同站点之间访问需要跨域 //实现跨域的方式&#xff1a;server: {proxy: {// 假设要跨域访问的后端 API 地址以 /api 开头/api: { //表示拦截以/api开头的…

牛客算法小题

目录 牛客.求和​编辑 牛客.abb 牛客.合并k个有序链表 牛客.滑雪&#xff08;暴力->递归->记忆化搜索&#xff09; 牛客.旋转字符串 牛客.求和 我没想到是dfs&#xff0c;另外我的dfs能力确实也不强&#xff0c;另外难度大的是他的那个输出 import java.util.Scanne…

医用氧检测标准:医用氧用什么检怎么检都做了明确规定

新规在《中国药典》2020 年版二部 XGB2021-061条于2022年5月22日实施。 医用氧技术指标&#xff1a;氧≥99.5% 、一氧化碳<0.0005、二氧化碳&#xff1c;0.03%、水分含量&#xff1c;0.0067%&#xff09; 一氧化碳对人体有害&#xff0c;过量的二氧化碳也会影响人的呼吸&a…

2024.8.20 作业

目录 思维导图&#xff1a; 面试题练习&#xff1a; 1、C语言中指针数组和数组指针的区别 2、结构体字节对齐的原理 3、TCP和UDP的区别 4、同步通信和异步通信的区别 5、多线程的理解 6、大小端验证 7、互斥锁 8、共享内存特点 9、C语言的指针 10、gcc编译 11、socket套接字 1…