C++常用排序拷贝替换算术生成集合运算算法总结

文章目录

      • 1.常用排序算法
        • 1. sort
        • 2. random_shuffle
        • 3. merge
        • 4. reverse
      • 2.常用拷贝和替换算法
        • 1. copy
        • 2. replace
        • 3. replace_if
        • 4. swap
      • 3.常用算术生成算法
        • 1. accumulate
        • 2. fill
      • 4.常用集合算法
        • 1. set_intersection
        • 2. set_union
        • 3. set_difference

1.常用排序算法

在C++中,排序和相关操作是非常实用的功能。

1. sort

sort函数是C++标准库提供的一个强大的排序算法,它能够对容器(如std::vectorstd::liststd::deque等)或数组中的元素进行排序。默认情况下,它执行升序排序,但也可以通过提供自定义比较函数来进行降序或其他定制排序。sort位于<algorithm>头文件中。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main(){// 初始化一个整数向量,包含一组待排序的数字vector<int>v = {1,3,2,6,5,7,4};// 对向量进行升序排序sort(v.begin(), v.end());// 遍历并打印排序后的向量for(int n : v){cout << n << " ";}cout << endl;// 对向量进行降序排序sort(v.begin(), v.end(),[](int &a,int &b){return a > b;});// 再次遍历并打印排序后的向量for(int n : v){cout << n << " ";}return 0;
}
2. random_shuffle

random_shuffle函数用于将容器中的元素随机重新排列。不过需要注意的是,在C++14之后,random_shuffle已经被标记为已弃用,推荐使用shuffle函数,它提供了更好的随机性控制。random_shuffle同样位于<algorithm>头文件中。

基本用法示例 :

//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
using namespace std;/* 主函数 */
int main(){/* 初始化一个整数向量,包含一组数字 */vector<int>v = {1,9,6,4,5,3,5};/* 初始化一个随机设备,用于生成随机数种子 */random_device rd;/* 使用Mersenne Twister算法初始化随机数生成器 */mt19937 g(rd());/* 使用随机数生成器对向量进行洗牌操作,以打乱其元素顺序 */shuffle(v.begin(), v.end(), g);/* 遍历并输出洗牌后的向量元素 */for(int n : v) cout << n << " ";return 0;
}
3. merge

merge函数用于合并两个已排序的序列,将它们合并成一个新的有序序列。这通常与sort配合使用于更复杂的排序算法中,如归并排序。它同样位于<algorithm>头文件中。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,演示如何使用标准库函数merge合并两个有序向量
int main(){// 初始化两个有序向量v1和v2vector<int>v1 = {1,3,5};vector<int>v2 = {2,4,6};// 初始化一个足够大的向量v3用于存放合并后的结果// 其大小为v1和v2的大小之和vector<int>v3(v1.size()+v2.size());// 调用标准库函数merge将v1和v2合并到v3中// 这里的merge函数假设输入的两个向量v1和v2是有序的// 合并后的向量v3仍然保持有序merge(v1.begin(), v1.end(),v2.begin(), v2.end(),v3.begin());// 遍历并打印合并后的向量v3for(int n : v3) cout << n << " ";return 0;
}
4. reverse

reverse函数用于反转容器或数组中元素的顺序。它同样简单易用,只需提供起始和结束迭代器即可。此函数也在<algorithm>头文件中定义。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个整数向量v1,包含元素1, 3, 5vector<int> v1 = {1, 3, 5};// 翻转向量v1中的元素顺序reverse(v1.begin(), v1.end());// 遍历并打印翻转后的向量v1中的每个元素for(int n : v1) cout << n << " ";return 0;
}

2.常用拷贝和替换算法

在C++中,常用的拷贝和替换算法是处理容器或数组元素时非常基础且重要的操作。

1. copy

copy函数用于将一个范围内的元素复制到另一个范围内。这个函数位于<algorithm>头文件中。

基本用法示例:

// 包含标准库的头文件,用于输入输出和算法操作
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 程序的入口点
int main() {// 初始化源向量,包含一组整数vector<int> src = {1, 2, 3, 4};// 初始化目标向量,大小与源向量相同vector<int> dest(4);// 将源向量的内容复制到目标向量// 使用标准库算法copy进行复制操作copy(src.begin(), src.end(), dest.begin());// 遍历目标向量并打印每个元素// 用于展示复制操作的结果for(int n : dest) cout << n << " ";// 程序正常结束return 0;
}
2. replace

replace函数用于在给定范围内查找指定的旧值,并将其替换为新值。它也位于<algorithm>头文件中。

基本用法示例:

#include <algorithm> // 包含算法库,用于使用replace函数
#include <iostream> // 包含输入输出流,用于标准输出
#include <vector> // 包含向量容器,用于存储和操作整数序列
using namespace std;int main() {vector<int> src = {1, 2, 3, 4}; // 初始化一个整数向量,包含1, 2, 3, 4// 使用replace函数将向量src中所有的2替换为99// replace函数的作用是:在给定的范围内,找到所有与目标值相同的元素,并将其替换为新值replace(src.begin(), src.end(), 2, 99);// 遍历向量src,并打印每个元素// 这里使用范围for循环来遍历向量,展示replace操作后的结果for(int n : src) cout << n << " ";return 0; // 程序正常退出
}
3. replace_if

replace_if函数类似于replace,但它不是直接匹配值,而是基于谓词(一个返回bool值的函数或函数对象)来决定是否进行替换。当谓词对元素返回true时,该元素会被替换。

基本用法示例:

#include <algorithm> // 使用标准库的算法
#include <iostream> // 使用标准库的输入输出流
#include <vector> // 使用标准库的向量容器
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个整数向量,包含1到4vector<int> src = {1, 2, 3, 4};// 使用replace_if算法替换向量中所有满足条件的元素// 条件是元素值为偶数,将其替换为99replace_if(src.begin(), src.end(), [](int n){return n%2==0;}, 99);// 遍历向量并打印每个元素for(int n : src) cout << n << " ";return 0; // 程序正常结束
}
4. swap

swap函数用于交换两个对象的值。它可以用于内置类型,也可以用于自定义类型(只要这些类型重载了swap函数或遵循移动语义)。对于标准库容器,可以直接调用它们的swap成员函数,或者使用std::swap函数,它位于<utility>头文件中。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化源向量vector<int> src = {1, 2, 3, 4};// 初始化目标向量vector<int> dest = {7,6,8,5,3,4};// 交换源向量和目标向量的内容// 说明:这里使用swap函数来交换两个向量的内容,目的是为了展示向量内容的交换过程swap(src, dest);// 遍历并打印源向量的内容for (int n : src) cout << n << " ";cout << endl;// 遍历并打印目标向量的内容for (int n : dest) cout << n << " ";return 0;
}

这些算法极大地简化了在C++中处理数据集合的任务,提高了代码的可读性和效率。

3.常用算术生成算法

在C++中,除了拷贝和替换算法外,算术生成算法也是处理数据集合时经常使用的工具。

1. accumulate

accumulate函数用于计算一系列数值的总和(累积和)。此函数位于<numeric>头文件中,可以接受一个初始值作为累积和的起始点。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <iostream>
#include <numeric>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main(){// 初始化一个整数向量v,包含一组预设的整数vector<int>v = {1,10,2,3,5};// 使用accumulate函数对向量v中的所有元素进行累加,初始值为0// accumulate函数是标准库中用于累加的算法,这里展示了其在向量操作中的应用int sum = accumulate(v.begin(), v.end(),0);// 输出累加结果cout << sum << endl;// 程序正常结束return 0;
}
2. fill

fill算法用于将一个范围内所有元素赋值为某个特定的值。它同样位于<algorithm>头文件中。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;// 主函数,程序的入口点
int main() {// 初始化一个长度为10的整数向量,所有元素初始值为0vector<int> vec(10, 0);// 使用标准库函数fill将向量的所有元素赋值为7fill(vec.begin(), vec.end(), 7);// 遍历向量并打印每个元素for(int num : vec)cout << num << " ";return 0;
}

这两个算法在处理数值集合时非常有用,accumulate用于求和运算,而fill则用于快速设置一系列值,比如初始化数组或向量等。

4.常用集合算法

集合算法在C++标准库中的<algorithm>头文件里定义,它们主要用于处理集合(如数组、向量等容器)之间的数学集合操作。

1. set_intersection

set_intersection算法用于找出两个已排序的集合的交集,并将结果存放到另一个集合中。集合需要是有序的,且不能有重复元素。

基本用法示例:

// 包含必要的头文件
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,用于存储两个集合的交集元素// 其大小预先估计为两个集合元素总数之和vector<int>v(s.size()+s1.size());// 使用set_intersection算法计算两个集合的交集// 并将结果存储在向量v中auto it = set_intersection(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 调整向量的大小,以去除多余的未使用的空间// 它的大小现在等于交集中实际元素的数量v.resize(it - v.begin());// 遍历并打印向量中的元素,即两个集合的交集for(int n : v) cout << n << " ";// 程序正常退出return 0;
}
2. set_union

set_union算法用于合并两个已排序的集合,去除重复元素,得到并集,并将结果存放到另一个集合中。

基本用法示例:

// 包含必要的头文件
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组不重复的整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,大小为两个集合元素总数,用于存储合并后的结果vector<int>v(s.size()+s1.size());// 使用set_union算法将两个集合的元素合并到向量v中,重复的元素只出现一次// set_union算法返回一个迭代器,指向向量v中第一个未被写入的元素auto it = set_union(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 根据返回的迭代器调整向量v的大小,使其正好包含所有合并后的元素v.resize(it - v.begin());// 遍历向量v,输出合并后的所有元素for(int n : v) cout << n << " ";return 0;
}
3. set_difference

set_difference算法用于找出两个已排序的集合的差集,即第一个集合中存在但第二个集合中不存在的元素,并将结果存放到另一个集合中。

基本用法示例:

//
// Created by 86189 on 2024/7/10.
//
//#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
using namespace std;// 主函数
int main(){// 初始化两个集合,分别包含一组整数set<int>s = {1,2,3,4,5,6};set<int>s1 = {2,4,6,8,10};// 初始化一个向量,用于存储两个集合的差集结果vector<int>v(s.size()+s1.size());// 使用std::set_difference算法计算两个集合的差集// 并将结果写入向量v中auto it = set_difference(s.begin(), s.end(),s1.begin(), s1.end(),v.begin());// 调整向量的大小,使其正好包含所有差集元素v.resize(it - v.begin());// 遍历并输出向量中的差集元素for(int n : v) cout << n << " ";return 0;
}

这些算法都要求输入序列是预先排序的,并且对于set_intersectionset_difference来说,如果输入序列中有重复元素,结果只包含每个不同元素的一个实例。

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

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

相关文章

【RHCE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

(pyqt5)弹窗-Token验证

前言 为了保护自己的工作成果,控制在合理的范围内使用,设计一个用于Token验证的弹窗. 代码 class TokenDialog(QDialog):def __init__(self, parentNone, login_userNone, mac_addrNone, funcNone):super(TokenDialog, self).__init__(parent)self.login_user login_userself…

手撸俄罗斯方块(五)——游戏主题

手撸俄罗斯方块&#xff08;五&#xff09;——游戏主题 当确定游戏载体&#xff08;如控制台&#xff09;后&#xff0c;界面将呈现出来。但是游戏的背景色、方块的颜色、方框颜色都应该支持扩展。 当前游戏也是如此&#xff0c;引入了 Theme 的概念&#xff0c;支持主题的扩…

Rust入门实战 编写Minecraft启动器#2建立资源模型

首发于Enaium的个人博客 我们需要声明几个结构体来存储游戏的资源信息&#xff0c;之后我们需要将json文件解析成这几个结构体&#xff0c;所以我们需要添加serde依赖。 serde { version "1.0", features ["derive"] }资源相关asset.rs use serde::De…

雨量监测站的重要性有哪些

在全球气候变化和极端天气事件频发的背景下&#xff0c;雨量监测站成为了我们理解降水模式、预测天气变化以及制定应对措施的重要工具。 雨量监测站是一种专门用于测量和记录降水量的设施。它们通过配备高精度的雨量传感器&#xff0c;能够实时监测降雨情况&#xff0c;并提供关…

【分布式系统】CephFS文件系统之MDS接口详解

目录 一.服务端操作 1.在管理节点创建 mds 服务 2.查看各个节点的 mds 服务&#xff08;可选&#xff09; 3.创建存储池&#xff0c;启用 ceph 文件系统 4.查看mds状态&#xff0c;一个up&#xff0c;其余两个待命&#xff0c;目前的工作的是node01上的mds服务 5.创建用户…

SuperCLUE最新测评发布,360智脑大模型稳居大模型第一梯队

7月9日&#xff0c;国内权威大模型评测机构SuperCLUE发布《中文大模型基准测评2024上半年报告》&#xff0c;360智脑大模型&#xff08;360gpt2-pro&#xff09;在SuperCLUE基准6月测评中&#xff0c;取得总分72分&#xff0c;超过GPT-3.5-Turbo-0125&#xff0c;位列国内大模型…

离线安装压缩工具xz指南

在Linux操作系统上离线安装压缩工具xz可能会遇到一些挑战&#xff0c;尤其是当官方下载地址无法访问时。本文将为你提供详细的指导&#xff0c;确保你能够顺利安装xz。 一、下载xz安装包 首先&#xff0c;你可以尝试从xz官方网站下载xz的安装包。以下是官方下载地址&#xff…

制作一个自动养号插件的必备源代码!

随着网络社交平台的日益繁荣&#xff0c;用户对于账号的维护和运营需求也日益增长&#xff0c;在这样的背景下&#xff0c;自动养号插件应运而生&#xff0c;成为了许多用户提升账号活跃度、增加曝光量的得力助手。 然而&#xff0c;制作一个高效、稳定的自动养号插件并非易事…

免费分享:中国1KM分辨率月平均气温数据集(附下载方法)

数据简介 中国1KM分辨率月平均气温数据集为中国逐月平均温度数据&#xff0c;空间分辨率为0.0083333&#xff08;约1km&#xff09;。 数据集获取&#xff1a;根据全国2472个气象观测点数据进行插值获取&#xff0c;验证结果可信。 数据集包含的地理空间范围&#xff1a;全国…

Kruskal

Prim算法用来处理稠密图&#xff0c;Kruskal算法来处理稀疏图。 大致思路&#xff1a; 先用结构体对该的边以及点进行储存&#xff0c;然后根据每条边的权重来进行升序排序&#xff0c; 取权重最小的边放入所要维护的树中&#xff1a;如果该条边不在区域中才会将其放入区域中…

常见摄像头模块性能对比

摄像头模块在现代电子设备与嵌入式开发中扮演着重要角色&#xff0c;从智能手机到安全监控系统&#xff0c;再到机器人视觉系统&#xff0c;它们无处不在。以下是一些常见的摄像头模块及其特点的对比&#xff1a; OV2640 分辨率&#xff1a;最高可达200万像素&#xff08;1600x…

vue3 antdv Modal通过设置内容里的容器的最小高度,让Modal能够适当的变高一些

1、当收款信息Collapse也折叠的时候&#xff0c;我们会发现Modal的高度也变成了很小。 2、我们希望高度稍微要高一些&#xff0c;这样感觉上面显示的Modal高度太小了&#xff0c;显示下面的效果。 3、初始的时候&#xff0c;想通过class或者style或者wrapClassName来实现&#…

交易员需要克服的十大心理问题

撰文&#xff1a;Koroush AK 编译&#xff1a;Chris&#xff0c;Techub News 本文来源香港Web3媒体&#xff1a;Techub News 一个交易者在交易上所犯下的最大的错误可能更多来自于心态的失衡而并非技术上的失误&#xff0c;类似的情况已经发生在了无数交易者身上。作为交易者…

linux自动化内存监控与告警

文章目录 前言一、脚本实现1. shell脚本实现2. 脚本功能概览 二、设置定时执行1. 编辑cron任务表2. 设置定时任务 三、通知结果示例总结 前言 在当今数字化与网络化日益普及的时代&#xff0c;系统管理与维护成为了确保业务连续性和数据安全的关键环节。其中&#xff0c;监控系…

宪法学学习笔记(个人向) Part.3

宪法学学习笔记(个人向) Part 3 3. 国家基本制度 3.1 国家性质 3.1.1 国家性质概述 国家性质的概念 国家性质也称国体&#xff0c;或国家的阶级本质&#xff0c;是指各个阶级在国家中的地位&#xff08;哪个阶层是统治阶层&#xff0c;哪个阶层是被统治阶层&#xff0c;哪个…

MT3056 交换序列

思路&#xff1a; 与题目 MT3055 交换排列 类似 代码&#xff1a; #include <bits/stdc.h> using namespace std; const int N 1e4 10; int n, fa[N], b[N], d[N]; void init(int n) {for (int i 1; i < n; i)fa[i] i; } int find(int x) {return x fa[x] ?…

快手可图模型的要点

Kolors模型 摘要与介绍 Kolors是一个基于扩散的文本生成图像模型&#xff0c;能够生成高逼真度的图像&#xff0c;支持英文和中文。该模型结合了通用语言模型&#xff08;GLM&#xff09;和由多模态大语言模型生成的细粒度标题&#xff0c;从而提升了其理解和渲染能力。 关键…

PostgreSQL 查询字段as别名驼峰大写未生效的坑

as别名驼峰大写的错误示例: select id, game_name as gameName from app_projects;运行效果: as别名驼峰大写的正确示例: select id, game_name as "gameName" from app_projects;运行效果: 代码示例:

1.10编程基础之简单排序--02:奇数单增序列

OpenJudge - 02:奇数单增序列http://noi.openjudge.cn/ch0110/02/ 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。 输入 共2行: 第1行为 N; 第2行为 N 个正整数,其间用空格间隔。 输出 增序输出的奇数序列,数据之间以逗号间隔。数…