当前位置: 首页 > news >正文

【C++】算法库(复制操作、交换操作、变换操作)

C++算法库

文章目录

  • C++算法库
    • 复制操作
      • copy , copy_if
      • copy_n
      • copy_backward
    • 交换操作
      • swap
      • swap_ranges
      • iter_swap
    • 变换操作
      • transform
      • replace
      • replace_copy replace_copy_if

算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。

》》概念约束
》》ranges标准库

C++20 在命名空间 std::ranges 中提供大多数算法的受约束版本,在这些算法中,范围既可以由迭代器-哨位对,也可以由单个 range 实参指定,还支持投影和成员指针可调用对象。

std::vector<int> v {7, 1, 4, 0, -1};
std::ranges::sort(v); // 受约束算法
  • 头文件
#include <algorithm>
#include <numeric> 
#include <memory>
#include <ranges> //C++20

复制操作

copy , copy_if

  • copy 复制范围 [first, last) 中的元素到从 d_first 开始的另一范围(复制目标范围)
  • copy_if 对对所要求的元素则返回 ​true 的一元谓词执行copy

first, last —要复制的元素范围
d_first — 目标范围的起始

vector<int> a = {1,2,3,4,5};
vector<int> b(10);
std::copy(a.begin() , a.end() , b.begin());
for(auto x : b)std::cout << x << " "; //1 2 3 4 5 0 0 0 0 0
//std::back_inserter用于动态获取b.end()位置插入
std::copy_if(a.begin() , a.end() , std::back_inserter(b), [](int x){return x % 2 == 0;});
for(auto x : b)std::cout << x << " ";//1 2 3 4 5 0 0 0 0 0 2 4 
  • ranges
std::ranges::copy(a , b.begin());
std::ranges::copy_if(a , b.begin(), [](int x){return x % 2 == 0;});

copy_n

复制始于 first 的范围中恰好 count 个值到始于 result 的范围。

first — 复制来源的元素范围起始
count — 要复制的元素数
result — 目标范围起始

std::string in {"1234567890"};
std::string out;
std::copy_n(in.begin(), 4, std::back_inserter(out));//1234
std::cout << out << '\n';
  • ranges
std::ranges::copy_n(in.begin(), 4, std::back_inserter(out));//1234

copy_backward

(按从后往前的顺序复制一个范围内的元素)
将范围 [first, last) 内的元素复制到终于 d_last 的范围。以逆序复制元素(首先复制末元素),但保持相对顺序。

first, last — 要复制的元素范围
d_last — 目标范围的结尾

std::vector<int> source = {1,2,3,4,5};
std::vector<int> destination(6);
std::copy_backward(source.begin(), source.end(), destination.end());
for(auto x : destination)std::cout << x << " ";//0 1 2 3 4 5
  • ranges
std::ranges::copy_backward(source, destination.end());

交换操作

swap

交换两个对象的值

vector<int> a = {1,2,3,4,5};
vector<int> b = {5,4,3,2,1};
std::swap(a, b);
for(auto x : a)cout << x << " ";//5 4 3 2 1
for(auto x : b)cout << x << " ";//1 2 3 4 5

swap_ranges

交换两个范围的元素
在范围 [first1, last1) 和始于 first2 的另一范围间交换元素。

first1, last1 — 要交换的第一个元素范围
first2 — 要交换的第二个元素范围的起始

std::vector<char> v{'a', 'b', 'c', 'd', 'e'};
std::list<char> l{'1', '2', '3', '4', '5'};
std::swap_ranges(v.begin(), v.begin() + 3, l.begin());
for(auto x : l)cout << x << " "; //a b c 4 5
  • ranges

在第一范围 [first1, first1 + M) 与第二范围 [first2, first2 + M) 交换

std::vector<char> v{'a', 'b', 'c', 'd', 'e' , 'f' ,'g' , 'h'};
std::ranges::swap_ranges(v.begin(), v.begin() + 2, v.begin() + 4 , v.begin() + 6);
for(auto x : v)cout << x << " "; //e f c d a b g h

iter_swap

交换两个迭代器所指向的元素

vector<int> a = {1,2,3,4,5};
vector<int> b = {5,4,3,2,1};
std::iter_swap(a.begin() , b.begin());
std::cout << a[0] << " " << b[0] << std::endl;//5 1

变换操作

transform

将一个函数应用于某一范围的各个元素,并在目标范围存储结果
应用一元函数 unary_op[first1, last1) 所定义的范围
应用二元函数 binary_op 到来自两个范围的元素对:一个以 [first1, last1) 定义,而另一个始于 first2

std::string s{"hello"};
std::transform(s.begin(), s.end(),s.begin(), // 写入相同位置[](unsigned char c) { return std::toupper(c); });
std::cout << s << '\n'; //HELLOvector<int> ordinals = {1,2,3,4,5};
std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(),ordinals.begin(), [](int a , int b){return a + b;});
for(auto x : ordinals)cout << x << " ";//2 4 6 8 10
  • ranges
    std::ranges::transform(s,s.begin(), // 写入相同位置[](unsigned char c) { return std::toupper(c); });std::ranges::transform(ordinals , ordinals, ordinals.begin(), [](int a , int b){return a + b;});

replace

将所有满足特定判别标准的值替换为另一个值
new_value 替换范围 [first, last) 中所有满足特定判别标准的元素。

vector<int> a = {1,2,3,2,5};
//所有为2的值替换为88
std::replace(a.begin(), a.end(), 2, 88);
for(auto x : a)cout << x << " ";// 1 88 3 88 5
  • ranges
std::ranges::replace(a, 2, 88);

replace_copy replace_copy_if

复制一个范围,并将满足特定判别标准的元素替换为另一个值
复制来自范围 [first, last) 的元素到始于 d_first 的范围,复制过程中以 new_value 替换所有满足特定判别标准的元素。

std::vector<int> v{1,1,1,2,3,4};
std::replace_copy(v.begin(), v.end(),v.begin(),1, 99);
for(auto x : v)cout << x << " ";//99 99 99 2 3 4
std::vector<int> v{5, 7, 4, 2, 8, 6, 1, 9, 0, 3};
std::replace_copy_if(v.begin(), v.end(),v.begin(),//输出到原地开头[](int n){ return n > 5; }, 99);
for(auto x : v)cout << x << " ";
  • ranges
std::ranges::replace_copy(v,v.begin(),1, 99);
std::ranges::replace_copy_if(v,v.begin(),[](int n){ return n > 5; }, 99);

相关文章:

【C++】算法库(复制操作、交换操作、变换操作)

C算法库 文章目录 C算法库复制操作copy , copy_ifcopy_ncopy_backward 交换操作swapswap_rangesiter_swap 变换操作transformreplacereplace_copy replace_copy_if 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操…...

CV计算机视觉每日开源代码Paper with code速览-2023.12.6

点击计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Rejuvenating image-GPT as Strong Visual Representation Learners 论文地址&#xff1a;https://a…...

面试经典150题(1-2)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天完成了两道(1-2)150&#xff1a; &#xff08;88. 合并两个有序数组&#xff09;题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 n…...

MySQL使用教程

数据构成了我们日益数字化的社会基础。想象一下&#xff0c;从移动应用和银行系统到搜索引擎&#xff0c;再到如 ChatGPT 这样的先进人工智能聊天机器人&#xff0c;这些工具若没有数据支撑&#xff0c;将寸步难行。你有没有好奇过这些海量数据都存放在哪里呢&#xff1f;答案正…...

微服务学习:Ribbon实现客户端负载均衡,将请求分发到多个服务提供者

Ribbon是Netflix开源的一个基于HTTP和TCP客户端负载均衡器。它主要用于在微服务架构中实现客户端负载均衡&#xff0c;将请求分发到多个服务提供者上&#xff0c;从而实现高可用性和扩展性。 Ribbon的主要特点包括&#xff1a; 客户端负载均衡&#xff1a;Ribbon是一个客户端负…...

孩子还是有一颗网安梦——Bandit通关教程:Level0

&#x1f575;️‍♂️ 专栏《解密游戏-Bandit》 &#x1f310; 游戏官网&#xff1a; Bandit游戏 &#x1f3ae; 游戏简介&#xff1a; Bandit游戏专为网络安全初学者设计&#xff0c;通过一系列级别挑战玩家&#xff0c;从Level0开始&#xff0c;逐步学习基础命令行和安全概念…...

读excel文件,借助openpyxl工具

读excel文件&#xff0c;借助openpyxl工具 import osimport requestsos.environ["http_proxy"] "http://127.0.0.1:7890" os.environ["https_proxy"] "http://127.0.0.1:7890"base_url "https://testnet.starscan.io/explore…...

ubuntu16.04升级openssl

Ubuntu16.04 默认带的openssl版本为1.0.2 查看&#xff1a;openssl version 1.下载openssl wget https://www.openssl.org/source/openssl-1.1.1.tar.gz 编译安装 tar xvf openssl-1.1.1.tar.gz cd openssl-1.1.1 ./config make sudo make install sudo ldconfig 删除旧版本 su…...

【力扣100】56.合并区间

添加链接描述 class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:# 队列&#xff0c;每次加进来两个元素&#xff1a;1.不包含&#xff1a;第一个元素出去&#xff0c;并放入result&#xff1b;2.包含&#xff1a;合并nlen(intervals)result…...

重磅!2023中国高校计算机大赛-人工智能创意赛结果出炉

目录 中国计算机大赛-人工智能创意赛现场C4-AI大赛颁奖及留影800个AI应用&#xff1f;这届大学生真能“搞事情”AI原生时代&#xff0c;百度要再培养500万大模型人才 中国计算机大赛-人工智能创意赛现场 12月8日&#xff0c;杭州&#xff0c;一位“白发老人”突然摔倒在地&…...

[Linux] 用LNMP网站框架搭建论坛

一、nginx在其中工作原理 原理&#xff1a; php-fpm.conf是控制php-fpm守护进程 它是php.ini是一个php解析器 工作过程&#xff1a; 1.当客户端通过域名请求访问时&#xff0c;Nginx会找到对应的虚拟主机 2. Nginx将确定请求。 对于静态请求&#xff0c;Nginx会自行处理…...

记录 | 使用samba将ubuntu文件夹映射到windows实现共享文件夹

一、ubuntu配置 1. 安装 samba samba 是在 Linux 和 UNIX 系统上实现 SMB 协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文件和打印机的一种通信协议。 sudo apt-…...

leetcode 股票DP系列 总结篇

121. 买卖股票的最佳时机 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。 只能进行一次交易 很简单&#xff0c;只需边遍历边记录最小值即可。 class Solution { public:int maxProfit(vector<int>& prices) {int res …...

深入理解Java虚拟机---对象的创建和内存异常溢出

深入理解Java虚拟机---对象的创建和内存异常溢出 对象的创建对象内存布局对象的访问定位内存溢出Java堆溢出虚拟机栈和本地方法栈溢出方法区和运行时常量池溢出本地直接内存溢出 对象的创建 Step1&#xff1a;虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是…...

windows MYSQL解决中文乱码问题

1.首先确保你已经把mysql配置了环境变量 2.打开window终端 3.输入mysql -u root -p 4.输入密码&#xff0c;就是安装的时候设置的root超级管理员权限密码 5.输入&#xff1a; SHOW VARIABLES LIKE ‘character%’; 出现上图&#xff0c;说明就会出现中文乱码问题。 6.该怎么办…...

EasyRecovery2024免费永久版手机数据恢复软件

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案&#xff0c;它支持从各种各样的存储介质恢复删除或者丢失的文件&#xff0c;其支持的媒体介质包括&#xff1a;硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…...

2023/12/11 作业

1.思维导图 2.作业 成果&#xff1a; 第一个头文件 #ifndef TEST3GET_H #define TEST3GET_H #include <QWidget> #include<QMessageBox> QT_BEGIN_NAMESPACE namespace Ui { class test3get; } QT_END_NAMESPACE class test3get : public QWidget { Q_OBJE…...

【11】Qt Designer

目录 VSCode添加外部工具 QtDesigner PyUIC PyRCC 加载UI文件模板代码 QMainWindow QWidget 常用知识点 1. 修改标题图标 2. 图片资源管理 3. 图片按钮 4. 加载对话框 5. 动态加载Widget 6. 修改主题 其他注意事项 事件被多次触发 PyQt5提供了一个可视化图形工…...

【算法优选】 动态规划之路径问题——贰

文章目录 &#x1f38b;前言&#x1f332;[下降最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&#x1f6a9;题目描述&#x1f6a9;算法思路&#xff1a;&#x1f6a9;代码实现 &#x1f38d;[最小路径和](https://leetcode.cn/problems/minimum-path-sum/)&…...

从视频中截取指定帧图片

前言&#xff1a; 我们在很多时候需要对视频文件进行分析&#xff0c;或者对视频产生缩略图。因此视频截取技术必不可少。 从本地文件中读取视频帧 导包 <dependency><groupId>org.jcodec</groupId><artifactId>jcodec</artifactId><versio…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...

ui框架-文件列表展示

ui框架-文件列表展示 介绍 UI框架的文件列表展示组件&#xff0c;可以展示文件夹&#xff0c;支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项&#xff0c;适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...