C++初学者指南-5.标准库(第二部分)--序列重新排序算法

news2024/9/22 5:40:40

C++初学者指南-5.标准库(第二部分)–序列重新排序算法

文章目录

  • C++初学者指南-5.标准库(第二部分)--序列重新排序算法
    • 移位元素
      • reverse / reverse_copy
      • rotate / rotate_copy
      • shift_left
      • shift_right
      • shuffle
    • 排序
      • sort
      • stable_sort
      • partial_sort / partial_sort_copy
      • nth_element
      • is_sorted
      • is_sorted_until
    • 分区
      • partition / partition_copy
      • stable_partition
      • is_partitioned
      • partition_point
    • 排列
      • prev_permutation / next_permutation
      • is_permutation
    • 相关内容

不熟悉 C++ 的标准库算法? ⇒ 简介

移位元素

reverse / reverse_copy

在这里插入图片描述
cppreferencecp

std::vector<int> v {0,1,2,4,6,8,9,3,5};
// reverse subrange (as shown in image):
reverse(begin(v)+2, begin(v)+7);  
for (int x : v) { cout << x << ' '; }  // 0 1 9 8 6 4 2 3 5
// reverse entire vector:
reverse(begin(v), end(v));  
for (int x : v) { cout << x << ' '; }  // 5 3 2 4 6 8 9 1 0

运行示例代码
在这里插入图片描述

std::vector<int> v {2,4,6,8,9};
std::ranges::reverse(v);
for (int x : v) { cout << x << ' '; }  // 9 8 6 4 2

运行示例代码
在这里插入图片描述
输出必须能够接收与输入范围中元素数量相同的元素。
cppreferencecp

std::vector<int> in {0,1,2,4,6,8,9,3,5};
std::vector<int> out; 
out.resize(5);
reverse_copy(begin(in)+2, begin(in)+7, begin(out));
for (int x : out) { cout << x << ' '; }  // 9 8 6 4 2

运行示例代码

在这里插入图片描述
输出必须能够接收与输入范围中元素数量相同的元素。

std::vector<int> in {2,4,6,8,9};
std::vector<int> out; 
out.resize(in.size());
std::ranges::reverse_copy(in, begin(out));
for (int x : out) { cout << x <<' '; }  // 9 8 6 4 2

运行示例代码

rotate / rotate_copy

在这里插入图片描述
执行一个循环左移:所有从开头到新第一元素之前的元素都被移到最后一个元素之后。
cppreferencecp

std::vector<int> v {1,2,3,4,5,6,7};
auto i = rotate(begin(v), begin(v)+2, end(v));  
for (int x : v) { cout << x <<' '; }  // 3 4 5 6 7 1 2
// returned iterator refers to old first:
auto const value = *i;  // 1
auto const index = distance(begin(v), i);  // 5

运行示例代码

在这里插入图片描述
cppreferencecp

std::vector<int> v {1,2,3,4,5,6,7};
auto sub = std::ranges::rotate(v, begin(v)+4);  
for (int x : v)   { cout << x <<' '; }  // 5 6 7 1 2 3 4
for (int x : sub) { cout << x <<' '; }  // 1 2 3 4

运行示例代码

在这里插入图片描述
输出必须能够接收与输入范围中元素数量相同的元素。
cppreferencecp

std::vector<int> in {1,2,3,4,5,6,7};
std::vector<int> out; 
out.resize(in.size());
rotate_copy(begin(in), begin(in)+2, end(in), begin(out));  
for (int x : out) { cout << x <<' '; }  // 3 4 5 6 7 1 2

在这里插入图片描述
输出必须能够接收与输入范围中元素数量相同的元素。
cppreferencecp

std::vector<int> in {1,2,3,4,5,6,7};
std::vector<int> out; 
out.resize(in.size());
std::ranges::rotate_copy(in, begin(in)+4, begin(out));  
for (int x : out) { cout << x <<' '; }  // 5 6 7 1 2 3 4

运行示例代码

shift_left

在这里插入图片描述
cppreferencecp

std::vector<int> v {1,2,3,4,5,6,7,8};
int const by = 3;
shift_left(begin(v), end(v), by);  
for (int x : v) { cout << x <<' '; }  // 4 5 6 7 8 ? ? ?

运行示例代码
在这里插入图片描述
cppreferencecp

std::vector<int> v {1,2,3,4,5,6,7,8};
int const by = 3;
auto result = ranges::shift_left(v, by);  
for (int x : result) { cout << x <<' '; }  // 4 5 6 7 8

运行示例代码

shift_right

在这里插入图片描述

在这里插入图片描述

shuffle

在这里插入图片描述
cppreference

#include <algorithm>
#include <random>
// 32 bit mersenne twister engine
auto const seed = std::random_device{}();
auto reng = std::mt19937{seed};
std::vector<int> v {0,1,2,3,4,5,6,7,8};
shuffle(begin(v)+2, begin(v)+7, reng);  
for (int x : v) { cout << x <<' '; }  // 0 1 … 7 8

运行示例程序
在这里插入图片描述

排序

sort

在这里插入图片描述
用于比较元素的自定义函数(对象)可以作为第三个参数传递。
cppreference

std::vector<int> v {8,9,3,1,2,3,5,4,7,6};
// sort subrange (as shown in image):
sort(begin(v)+2, begin(v)+8);
for (int x : v) { cout << x <<' '; }  // 8 9 1 2 3 3 4 5 7 6
// sort entire vector:
sort(begin(v), end(v));
for (int x : v) { cout << x <<' '; }  // 1 2 3 3 4 5 6 7 8 9
// sort vector in descending order:
sort(begin(v), end(v), std::greater<>{});
for (int x : v) { cout << x <<' '; }  // 9 8 7 6 5 4 3 3 2 1

运行示例代码
在这里插入图片描述
cppreference

stable_sort

在这里插入图片描述
stable ⇒ a 在 A 之前(而且 E 在 e 之前),尽管它们在不区分大小写的比较中是等价的。
默认情况下,使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第三个参数传递。
cppreference

#include <cctype>  // std::tolower
auto compare_case_insensitive = [](char x, char y) {
  return std::tolower(x) < std::tolower(y); };
std::string s = "gbaEAfec";
stable_sort(begin(s)+1, begin(s)+7, compare_case_insensitive);
cout << s;  // gaAbEefc

运行示例代码
在这里插入图片描述
cppreference

partial_sort / partial_sort_copy

在这里插入图片描述
默认情况下,使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第4个参数传递。
cppreference

std::vector<int> v {7,4,6,2,3,5,1,9};
// sort 4 smallest elements:
auto const nth = begin(v) + 4;
partial_sort(begin(v), nth, end(v));
for (int x : v) { cout << x <<' '; }  // 1 2 3 4 7 6 5 9

在这里插入图片描述
cppreference

在这里插入图片描述
默认情况下,使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第5个参数传递。
cppreference

std::vector<int> in {6,2,3,5,1};
// get sorted copy of 3 smallest elements:
int const n = 3;
std::vector<int> out; 
out.resize(n);
partial_sort_copy(begin(in), end(in), begin(out), end(out));
for (int x : out) { cout << x <<' '; }  // 1 2 3
// if output is larger than input:
out.resize(100);
auto const e = partial_sort_copy(begin(in), end(in), begin(out), end(out));
out.erase(e, end(out));  // shrink to fit
for (int x : out) { cout << x <<' '; }  // 1 2 3 5 6

运行示例代码
在这里插入图片描述
cppreference

nth_element

在这里插入图片描述
默认情况下,使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第4个参数传递。
cppreference

std::vector<int> v {4,2,5,6,3,7,1};
// get 5th element in sorted order
int const n = 4;
auto nth = begin(v) + n;
nth_element(begin(v), nth, end(v));
cout << *nth;  // 5

运行示例代码
在这里插入图片描述
cppreference

is_sorted

在这里插入图片描述
默认使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第3个参数传递。
cppreference

std::vector<int> v {2,3,4,5,6,1,0};
// test subrange (as shown in image):
cout << is_sorted(begin(v), begin(v)+5);  // true
// test entire vector:
cout << is_sorted(begin(v), end(v));  // false

运行示例代码
在这里插入图片描述
cppreference

is_sorted_until

在这里插入图片描述
默认使用运算符 < 比较元素; 用于比较元素的自定义函数(对象)可以作为第3个参数传递。
cppreference

std::vector<int> v {2,3,4,5,4,2,0,7,8};
// test from 1st to 7th (as shown in image):
auto i = is_sorted_until(begin(v), begin(v)+7);
// print sorted subrange
auto const print = [](int x){ cout << x << ' '; };
std::for_each(begin(v), i, print);  // 2 3 4 5

运行示例代码
在这里插入图片描述
cppreference

std::vector<int> v {2,3,4,5,4,2,0};
auto const i = std::ranges::is_sorted_until(v);
// print sorted subrange
auto const print = [](int x){ cout << x << ' '; };
std::for_each(begin(v), i, print);  // 2 3 4 5

运行示例代码

分区

partition / partition_copy

在这里插入图片描述
请注意,结果分区内元素的相对顺序不必与原序列中的顺序相同。
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> v {3,4,6,5,7,8,0};
auto i = partition(begin(v), end(v), is_odd);
auto const print = [](int x){ cout << x << ' '; };
// print 1st subrange
std::for_each(begin(v), i, print);  // 3 7 5
// print 2nd subrange
std::for_each(i, end(v), print);  // 6 4 8 0

运行示例代码
在这里插入图片描述
cppreference
在这里插入图片描述
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> in {3,4,6,5,0};
// ensure each output could hold all elements:
std::vector<int> out1; out1.resize(in.size());
std::vector<int> out2; out2.resize(in.size());
auto ends = partition_copy(begin(in), end(in), begin(out1), begin(out2), is_odd);
// resize partitions to fit content
out1.erase(ends.first,  end(out1));
out2.erase(ends.second, end(out2));
// print partitions
for (int x : out1) { cout << x << ' '; }  // 3 5
for (int x : out2) { cout << x << ' '; }  // 4 6 0

运行示例代码
在这里插入图片描述
cppreference

stable_partition

在这里插入图片描述
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> v {3,4,6,5,7,8,0};
auto i = stable_partition(begin(v), end(v), is_odd);
auto const print = [](int x){ cout << x << ' '; };
// print 1st subrange
std::for_each(begin(v), i, print);  // 3 5 7
// print 2nd subrange
std::for_each(i, end(v), print);  // 4 6 8 0

运行示例代码
在这里插入图片描述
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> v {3,4,6,5,7,8,0};
auto r2 = std::ranges::stable_partition(v, is_odd);
// print 2nd subrange
for (int x : r2) { cout << x << ' '; }  // 4 6 8 0

运行示例代码

is_partitioned

在这里插入图片描述
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> v {3,7,5,6,4,8,0};
cout << is_partitioned(begin(v), end(v), is_odd);  // true

运行示例代码

在这里插入图片描述
cppreference

partition_point

在这里插入图片描述
在一个划分的输入范围内执行二分查找,以找到第一个使得 f 为 false 的元素。
cppreference

auto const is_odd = [](int x) { return (x & 1); };
std::vector<int> v {3,7,5,6,4,8,0};
auto i = partition_point(begin(v), end(v), is_odd);
auto const print = [](int x){ cout << x << ' '; };
// print 1st subrange
std::for_each(begin(v), i, print);  // 3 7 5
// print 2nd subrange
std::for_each(i, end(v), print);  // 6 4 8 0

运行示例代码
在这里插入图片描述
cppreference

排列

prev_permutation / next_permutation

在这里插入图片描述
在这里插入图片描述
cppreference
在这里插入图片描述
运行示例代码

在这里插入图片描述
在这里插入图片描述
cppreference

is_permutation

在这里插入图片描述
cppreference

std::vector<int> v1 {1,2,3,4};
std::vector<int> v2 {4,2,1,3};
std::vector<int> v3 {5,0,1,2};
cout << is_permutation(begin(v1), end(v1), begin(v2));  // true
cout << is_permutation(begin(v1), end(v1), begin(v3));  // false

运行示例代码

在这里插入图片描述
cppreference

相关内容

视频:reverse, rotate by:Conor Hoekstra
视频:sort, stable_sort by Conor Hoekstra
视频:partition, stable_partition and more by Conor Hoekstra
视频:next_permutation, prev_permutation by Conor Hoekstra
标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

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

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

相关文章

MD5加密的好处

MD5加密的好处主要包括&#xff1a; 1.快速计算&#xff1a;MD5可以非常快速地对任意大小的数据计算出128位的哈希值&#xff0c;这使得它在处理大量数据时非常高效。 2.抗碰撞性&#xff1a;理论上&#xff0c;要找到两个不同的输入数据生成相同的MD5摘要是非常困难的&#xf…

jQuery来写员工新增和删除(程序默写练习)

目录 一、实现功能: 二、涉及知识点 1、函数的写法&#xff1a; 2、confirm函数 3、获取父节点&#xff0c;以及通过父节点获取指定类型和位置的子节点 3、删除节点元素 4、获取节点元素的文本内容 5、val()函数和text()函数的区别 6、创建一个节点 7、挂载节点、插入…

【香橙派系列教程】(三)常用外设开发

【三】常用外设开发 文章目录 【三】常用外设开发1. wiringPi外设SDK安装2.蜂鸣器BB响1.怎么将其他文件夹里面的文件复制到目前的文件夹&#xff1f;2.修改vim编辑器的tab缩进,显示行数3.蜂鸣器配合时间函数开发 小插曲&#xff1a;shell脚本3.超声波测距1. 测距原理基本说明2.…

TapData 信创数据源 | 国产信创数据库 TiDB 数据迁移指南,加速国产化进程,推进自主创新建设

随着国家对自主可控的日益重视&#xff0c;目前在各个行业和区域中面临越来越多的国产化&#xff0c;采用有自主知识产权的国产数据库正在成为主流。长期以来&#xff0c;作为拥有纯国产自研背景的 TapData&#xff0c;自是非常重视对于更多国产信创数据库的数据连接器支持&…

EasyTwin的动画系统已经到了next level?快来一探究竟!

在实际的数字孪生项目场景建设中&#xff0c;水利项目中的洪水推演、工业领域的工程施工模拟、车间产线运转、机械装置和零件配置展示等项目场景&#xff0c;都对动画效果有很强的使用需求&#xff0c;这是对渲染软件和设计师能力的极大考验&#x1f198;。 别担心&#xff01…

使用人工智能在乳腺癌筛查中的早期影响指标| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 Early Indicators of the Impact of Using AI in Mammography Screening for Breast Cancer 使用人工智能在乳腺癌筛查中的早期影响指标 01 文献速递介绍 基于人群的乳腺癌筛查通过使用乳房X线摄影成功地降低了乳腺癌的死亡率&#xff0c;但这给乳腺放射科医生…

【通俗理解】自相似性探索——从分形到递归的奇妙之旅

【通俗理解】自相似性探索——从分形到递归的奇妙之旅 自相似性的奇妙比喻 你可以把自相似性比作一个“无限镜子”&#xff0c;它能够在不同的尺度上反射出相同的图案或结构。就像是在一面两面镜之间放置一个物体&#xff0c;镜子中的倒影会无限重复&#xff0c;每个倒影都与原…

韦东山瑞士军刀项目自学之中断控制LED

使用库函数设置外部中断控制LED 重点&#xff1a;在设置GPIO为外部中断控制源时&#xff0c;你至少要先检查一下信号是不是来自于你所设置的那个端口&#xff01;因为EXTI并不是对每个端口单独引线&#xff0c;而是将所有组的同编号的部分接口只用一个EXTI进行控制&#xff0c…

【最新】cuda和cudnn和显卡驱动的对应关系

NV官方文档Support Matrix — NVIDIA cuDNN v9.2.1 documentation下列的非常清楚&#xff0c;如图&#xff1a;

Cocos Creator2D游戏开发(9)-飞机大战(7)-爆炸效果

这个爆炸效果我卡在这里好长时间,视频反复的看, 然后把代码反复的测试,修改,终于给弄出来 视频中这段,作者也是修改了好几次, 跟着做也走了不少弯路; 最后反正弄出来了; 有几个坑; ① 动画体创建位置是enemy_prefab ② enemy_prefab预制体下不用放动画就行; ③ 代码中引用Anima…

入门 PyQt6 看过来(案例)18~ 表格属性

QTableWidget是常用的显示数据表格控件&#xff0c;是QTableView的子类&#xff0c;它使用标准的数据模型&#xff0c;并且其单元格数据是通过QTableWidgetItem对象来实现的。 QTableWidget类常用方法如下表&#xff1a; 方法描述setRowCount(行数)设置表格行数setColumnCount…

【C++高阶】哈希:全面剖析与深度学习

目录 &#x1f680; 前言一&#xff1a; &#x1f525; unordered系列关联式容器1.1 unordered_map1.2 unordered_set 二&#xff1a; &#x1f525; 哈希的底层结构 ⭐ 2.1 哈希概念⭐ 2.2 哈希冲突⭐ 2.3 哈希函数⭐ 2.4 哈希冲突解决2.4.1 &#x1f304;闭散列2.4.2 &#x…

【课程系列06】某乎AI大模型全栈工程师-第6期

网盘链接 链接&#xff1a;https://pan.baidu.com/s/1QLkRW_DmIm1q9XvNiOGwtQ --来自百度网盘超级会员v6的分享 课程目标 【知乎大模型课程】学习的四个维度 &#x1f449;指挥层&#xff1a;学高阶指令工程 AI编程等&#xff0c;指挥大模型完成90%代码任务&#xff0c;包…

MySql理解RR(可重复读)事务隔离级别

demo&#xff0c;理解mysql的可重复读隔离级别&#xff0c;当前读、快照读的区别 如下图&#xff0c;表sys_user中我同时开启三个事务连接&#xff1a; session1&#xff1a; 当session1开启事务时&#xff0c;mysql使用快照读保存事务开始前的数据&#xff0c;所以这条事务…

数据仓库及离线数仓架构、实时数仓架构

往期推荐 大数据HBase图文简介-CSDN博客 数仓常见名词解析和名词之间的关系-CSDN博客 目录 0. 前言 0.1 浅谈维度建模 0.2 数据分析模型 1. 何为数据仓库 1.1 为什么不直接用业务平台的数据而要建设数仓&#xff1f; 1.2 数据仓库特征 1.3 数据仓库和数据库区别 1.4 以…

VULNHUB-XXE漏洞 靶机

1.导入打开虚拟机 然后没账号密码~ 虚拟机虚拟网络编辑器是net 可以知道虚拟机的ip池 直接拿工具扫描端口 御剑 Zenmap namp 都可以 然后打开这个端口 扫描一下目录发现有个robots.txt 有个/xxe/应该是个路径 打开看看 admin.php是个文件 有个登录 试了试弱口令没办法 抓…

谁是金融核心系统市场第一名?中兴通讯旗下金篆GoldenDB

从IDC发布的《中国银行业本地部署分布式事务型数据库市场份额&#xff0c;2023》报告来看&#xff0c;中兴通讯旗下的金篆GoldenDB以24.8%的市场份额在银行业本地部署分布式数据库市场中独占鳌头&#xff0c;排名“第一”。    毕竟关系着人民群众的财产安全&#xff0c;银行…

upload-labs靶场1-19关秒杀攻略

Pass-01 打开第一关&#xff0c;我们先上传一个jpg文件看看这个文件上传功能正不正常 发现可以正常上传&#xff0c;并且访问这个图片也能正常访问&#xff0c;然后我们尝试上传php文件&#xff0c;发现弹出个警告&#xff0c;不让上传 我们上传php时开启抓包&#xff0c;发现抓…

VMware、Yum、VIM、Zsh、Oh My Zsh - 搭建属于你的虚拟机

目录 VMware 虚拟机搭建 下载 Centos7 镜像 创建虚拟机 虚拟机网络配置 常用软件配置 yum 配置 vim 安装及配置 zsh 安装 on my zsh 用起来 基本安装 插件 zsh-augosuggestions&#xff08;自动补全&#xff09; 插件 zsh-syntax-highlighting&#xff08;语法高亮…

数据结构:二叉树(链式结构)

文章目录 1. 二叉树的链式结构2. 二叉树的创建和实现相关功能2.1 创建二叉树2.2 二叉树的前&#xff0c;中&#xff0c;后序遍历2.2.1 前序遍历2.2.2 中序遍历2.2.3 后序遍历 2.3 二叉树节点个数2.4 二叉树叶子结点个数2.5 二叉树第k层结点个数2.6 二叉树的深度/高度2.7 二叉树…