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

C++初学者指南-5.标准库(第二部分)--更改元素算法

C++初学者指南-5.标准库(第二部分)–更改元素算法

文章目录

  • C++初学者指南-5.标准库(第二部分)--更改元素算法
    • 填充/覆盖范围
      • fill / fill_n
      • generate / generate_n
    • 更改/替换值
      • transform
      • replace / replace_if
      • replace_copy / replace_copy_if
    • 相关内容

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

填充/覆盖范围

fill / fill_n

在这里插入图片描述
cppreference

std::vector<int> v {1,0,9,0,9,1,0,1};
fill(begin(v)+2, begin(v)+7, 2);
for (int x : v) { cout << x << ' '; }  // 1 0 2 2 2 2 2 1

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

std::vector<int> v {1,0,9,0,9,1,0,1};
fill_n(begin(v)+2, 5, 2);
for (int x : v) { cout << x << ' '; }  // 1 0 2 2 2 2 2 1

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

generate / generate_n

示例:C++14 lambda作为生成器Generator
注:C++生成器和Python的生成器概念上很像,都是保存一个算法用于生成数据。

auto gen = [i=0]() mutable { i += 2; return i; };
//     init-^^^    ^^^^^^^⇒ member 'i' changeable!
cout << gen();  // 2
cout << gen();  // 4
cout << gen();  // 6

运行示例代码
示例:函数类用作生成器

class int_range_generator {int val_  = 0;int step_ = 1;
public:int_range_generator () = default;explicit constexprint_range_generator (int start, int step=1) noexcept: val_{start}, step_{step} {}constexpr int operator () () noexcept { int const old = val_;val_ += step_; return old;}
};
auto gen = int_range_generator{2,2};
cout << gen();  // 2
cout << gen();  // 4
cout << gen();  // 6

在这里插入图片描述
cppreference

auto gen = [i=0]() mutable { i += 2; return i; };
std::vector<int> v;
v.resize(7,0);
generate(begin(v)+1, begin(v)+5, gen);
for (int x : v) { cout << x << ' '; }  // 0 2 4 6 8 0 0

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

auto gen = [i=0]() mutable { i += 2; return i; };
std::vector<int> v;
v.resize(7,0);
generate_n(begin(v)+1, 4, gen);
for (int x : v) { cout << x << ' '; }  // 0 2 4 6 8 0 0

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

更改/替换值

transform

该算法在其他编程语言中也称为 map。
输出目标必须能够接收与输入范围中的元素数量相同的数量。
函数(对象)f 不能有副作用 / 不能是有状态的,因为它应用于输入元素的顺序是不能保证的。

在这里插入图片描述
cppreference

// f: 'x' → "<x>"
auto f = [](char c) { return std::string("<") + c + ">"; };
std::string in = "vwxyza";
std::vector<std::string> out;
// make sure 'out' can fit result
out.resize(4);
transform(begin(in)+1, begin(in)+5, begin(out), f);
for (auto const& x : out) { cout << x << ' '; }  // <w> <x> <y> <z>

运行示例代码

在这里插入图片描述
cppreference

// f: 'y',3 → "yyy"
auto f = [](char c, int i) { return std::string(i,c); };
std::string in1 = "wxy";
std::vector<int> in2 = {1,2,3};
std::vector<std::string> out;
// make sure 'out' can fit result
out.resize(3);
transform(begin(in1), end(in1), begin(in2), begin(out), f);
for (auto const& x : out) { cout << x << ' '; }  // w xx yyy

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

replace / replace_if

在这里插入图片描述
cppreference

std::vector<int> v {1,2,3,2,4,2,2,6};
replace(begin(v)+2, begin(v)+7, 2, 0);
for (int x : v) { cout << x << ' '; }  // 1 2 3 0 4 0 0 6

在这里插入图片描述

replace_copy / replace_copy_if

输出目标必须能够接收与输入范围中元素数量相等的元素。

在这里插入图片描述
cppreference

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

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

在这里插入图片描述
cppreference

auto const is_even = [](int x) { return !(x & 1); };
std::vector<int> in {2,3,2,5,4,6,6};
std::vector<int> out;
out.resize(5);
replace_copy_if (begin(in)+1, begin(in)+7, begin(out), is_even, 0);
for (int x : out) { cout << x << ' '; }  // 3 0 5 0 0

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

相关内容

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Spring Boot】用 Spring Security 实现后台登录及权限认证功能
  • Java高级
  • Linux手动编译方式安装httpd及配置系统服务(含不同安装方式简介)
  • AI认知理解
  • C语言 | Leetcode C语言题解之第318题最大单词长度乘积
  • springcloud和springboot版本对照表
  • ChatGPT协助撰写研究论文的11种方法【全集】
  • 第九十八周周报
  • C++的vector类
  • 搭建jenkins一键部署java项目
  • pandas中的concat函数:详尽指南
  • HTTP简单概述
  • QML中的Date将时间戳和指定格式时间互转
  • 人工智能与机器学习的相关介绍
  • 速盾:cdn防盗链
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • 4. 路由到控制器 - Laravel从零开始教程
  • JavaScript学习总结——原型
  • Java精华积累:初学者都应该搞懂的问题
  • Js基础知识(四) - js运行原理与机制
  • Lucene解析 - 基本概念
  • MYSQL 的 IF 函数
  • PV统计优化设计
  • React-生命周期杂记
  • Sublime Text 2/3 绑定Eclipse快捷键
  • vue中实现单选
  • 百度地图API标注+时间轴组件
  • 与 ConTeXt MkIV 官方文档的接驳
  • 原生 js 实现移动端 Touch 滑动反弹
  • 2017年360最后一道编程题
  • ​Java基础复习笔记 第16章:网络编程
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # linux 中使用 visudo 命令,怎么保存退出?
  • # 飞书APP集成平台-数字化落地
  • #### golang中【堆】的使用及底层 ####
  • #100天计划# 2013年9月29日
  • #图像处理
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (函数)颠倒字符串顺序(C语言)
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十一)图像的罗伯特梯度锐化
  • (四)库存超卖案例实战——优化redis分布式锁
  • (算法)Travel Information Center
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转) 深度模型优化性能 调参
  • (转)EOS中账户、钱包和密钥的关系
  • (转)nsfocus-绿盟科技笔试题目
  • (转)重识new
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**