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

这篇具有很好参考价值的文章主要介绍了【C++】算法库(复制操作、交换操作、变换操作)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++算法库


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

》》概念约束
》》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'; //HELLO

vector<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 替换所有满足特定判别标准的元素。文章来源地址https://www.toymoban.com/news/detail-756449.html

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++】算法库(复制操作、交换操作、变换操作)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 元启发式算法库 MEALPY 初体验-遗传算法为例

    官网: MealPY官网 开源许可: (GPL) V3 MEALPY (MEta-heuristic ALgorithms in PYthon) 是一个提供最新自然启发式元启发算法的Python模块,它是最大的此类Python模块之一。这些算法模仿自然界中的成功过程,包括生物系统以及物理和化学过程。mealPy 的目标是免费向所有人分享元启发领域的知识

    2024年04月11日
    浏览(42)
  • C语言分析基础排序算法——交换排序

    目录 交换排序 冒泡排序 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化 快速排序非递归版 见C语言基础知识指针部分博客C语言指针-CSDN博客 Hoare版本快速排序 Hoare版本快速排序的过程类似于二叉树前序遍历的过程,基本思想是:在需要排序的

    2024年03月14日
    浏览(46)
  • 用C语言进行学生成绩排序(交换排序算法)

    所谓交换,是指根据序列中两个元素的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多,本文主要介绍冒泡排序和快速排序。 上一篇的博客学习了插入排序,今天这里是交换排序,它和插入排序都属于内部排序 冒泡排序的基本思想是:从后往前

    2024年02月15日
    浏览(35)
  • C++ string类(2)—成员访问、插入、删除、替换、查找和交换操作

    目录 一、成员访问 1、operator[ ]at 2、front( )back( ) 二、插入元素 insert( ) 三、删除元素 erase( ) 四、替换元素 replace( ) 五、查找元素 find( ) 六、交换字符串 swap( ) 七、C风格 c_str 八、rfindsubstr 虽然二者功能一样,但[ ]比较常用。 访问越界[ ]会直接报错,.at( )会抛异常。 insert/er

    2024年02月05日
    浏览(43)
  • 【动态规划】【C++算法】801. 使序列递增的最小交换次数

    【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径 动态规划汇总 数组 我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中,我们可以交换 nums1[i] 和 nums2[i]的元素。 例如,如果 nums1 = [1,2,3,8] , nums2 =[5,6,7,4] ,你可以交换 i = 3 处的元素

    2024年01月22日
    浏览(43)
  • 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用

    我们继续来进行国密算法的演示。 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用。 sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的; 非对称加密算法,即有一对不一样的密钥:公钥和私钥,公钥用来加密,私钥用来解密; 公钥和私钥:公钥,可以公开。

    2024年02月06日
    浏览(59)
  • 将Speex AEC MDF算法从C语言移植到Matlab:一种谦逊的语言变换与重构的旅程

    尊敬的读者们,我今天希望与大家分享的是一个非常有趣的编程挑战,即将Speex AEC (Acoustic Echo Cancellation) MDF (Multi-Delay Filter) 算法从C语言移植到Matlab的过程。这是一个激动人心的主题,涉及到多个领域的知识,包括信号处理、算法设计、以及跨语言的编程技能。 实战项目下载

    2024年02月16日
    浏览(46)
  • C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

     冒泡法排序 :顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升, 大的数据就像石块一样往下沉,因此称为冒泡法排序法。 假如有n个数字,则需要进行n-1轮  第一轮结果:最大的数,被放在了最后一位  第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素

    2024年02月03日
    浏览(49)
  • 【C++】STL 算法 - 拷贝替换算法 ( 元素复制算法 - copy 函数 | 元素替换算法 - replace 函数 | 替换符合要求的元素算法 - replace_if 函数 )

    在 C++ 语言 的 标准模板库 ( STL , STL Standard Template Library ) 中 , 提供了 copy 元素复制算法函数 用于 将 一个容器中的元素 复制 到 另外一个 容器中 ; copy 元素赋值函数 将 输入容器 的 [ 起始迭代器, 终止迭代器 ) 范围 内的 元素 复制 到输出序列中 , 从输出容器 的 指定开始位置

    2024年01月20日
    浏览(59)
  • 【C++】STL 算法 - transform 变换算法 ③ ( transform 和 for_each 算法的区别 | STL 算法接收的可调用对象分析 - 以 transform 为例进行分析)

    for_each 算法 主要用于 对容器中的每个元素执行某种操作 , 而不一定产生新的值或改变原容器的值 , 可能涉及改变元素的值 , 输出元素的值等 ; 使用该算法常用于 遍历输出到控制台 操作 或 修改原容器中的元素内容 操作 ; transform 算法 主要用于 对容器中的每个元素进行转换

    2024年01月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包