首页 > 编程语言 >C++学习随笔——算法transform和lambda的用法

C++学习随笔——算法transform和lambda的用法

时间:2024-08-27 16:54:48浏览次数:10  
标签:std result int transform C++ vec lambda

std::transform 是一个常用的 STL 算法,用于对序列中的每个元素进行操作,并将结果存储在另一个序列中。
lambda 表达式是一种匿名函数,可以在需要传递函数作为参数的场景中使用,比如在 std::transform 中。

语法:
// 一元操作
std::transform(InputIterator1 first1, InputIterator1 last1, OutputIterator result, UnaryOperation op);

// 二元操作
std::transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryOperation op);

first1, last1:表示输入序列的开始和结束迭代器。
first2: 表示第二个输入序列的开始迭代器(用于二元操作)。
result:表示输出序列的开始迭代器。
op:表示应用于输入序列的操作函数,可以是普通函数、仿函数或 lambda 表达式。

使用 std::transform 和 lambda 表达式的示例

一元操作:

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    std::vector<int> result(vec.size());

    // 使用 std::transform 和 lambda 表达式将每个元素加倍
    std::transform(vec.begin(), vec.end(), result.begin(), [](int x) {
        return x * 2;
    });

    // 输出结果
    for (int n : result) {
        std::cout << n << " ";  // 输出: 2 4 6 8 10
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中: std::transform 对 vec 中的每个元素应用 lambda 表达式 [](int x) { return x * 2; },并将结果存储在 result 向量中。

二元操作:

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec1 = {1, 2, 3, 4, 5};
    std::vector<int> vec2 = {10, 20, 30, 40, 50};
    std::vector<int> result(vec1.size());

    // 使用 std::transform 和 lambda 表达式将两个数组的元素相加
    std::transform(vec1.begin(), vec1.end(), vec2.begin(), result.begin(), [](int x, int y) {
        return x + y;
    });

    // 输出结果
    for (int n : result) {
        std::cout << n << " ";  // 输出: 11 22 33 44 55
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中: std::transform 将 vec1 和 vec2 中对应的元素通过 lambda 表达式 [](int x, int y) { return x + y; } 相加,并将结果存储在 result 向量中。

lambda 表达式的结构
[capture](parameters) -> return_type { // function body }
capture:捕获列表,指定在 lambda 表达式中如何捕获外部变量。可以是按值捕获(=),按引用捕获(&),或者显式列出要捕获的变量。
parameters:参数列表,和普通函数的参数列表一样。
return_type(可选):返回类型,如果可以从函数体中推导出返回类型,可以省略。
函数体:lambda 表达式的具体操作。

示例:捕获外部变量
在某些情况下,lambda 可能需要使用外部变量。这时可以通过捕获列表来实现:

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};
    int factor = 3;

    // 使用 lambda 表达式捕获外部变量 factor
    std::transform(vec.begin(), vec.end(), vec.begin(), [factor](int x) {
        return x * factor;
    });

    // 输出结果
    for (int n : vec) {
        std::cout << n << " ";  // 输出: 3 6 9 12 15
    }
    std::cout << std::endl;

    return 0;
}

在这个例子中,lambda 表达式 [factor](int x) { return x * factor; } 捕获了外部变量 factor,并将 vec 中的每个元素乘以该值。

标签:std,result,int,transform,C++,vec,lambda
From: https://www.cnblogs.com/kitanoki/p/18383045

相关文章

  • C++学习随笔——C++仿函数的应用方法
    仿函数的基本定义仿函数(Functor),也称为函数对象(FunctionObject),是一个行为像函数的对象。实现仿函数的方法是重载类中的operator()操作符,使得对象能够像调用普通函数一样使用。仿函数的主要优势是它们可以拥有状态,并且可以被用于STL算法和容器中。简单例子:点击查看代码#in......
  • C++入门第一课
    我准备再出一个合集,这个合集主要是讲C++一些知识,主要是因为懒得写洛谷题解(´ー∀ー`),适合新手学习。本人语文不太好,有些用词不太恰当,还请各位多多指正o( ̄︶ ̄)oOK我们现在就开起C++学习吧ヾ(≧▽≦*)o!第一课认识C++要学习C++,就首先要知道C++是什么。1.C++是一种面向对象的计算机程......
  • C++学习笔记——范围基于 for 循环和for_each循环的区别
    范围基于for循环是C++11中引入的,简化了遍历数组或容器的代码点击查看代码#include<iostream>#include<vector>intmain(){std::vector<int>numbers={1,2,3,4,5};//使用范围基于for循环遍历for(intnum:numbers){std::cout<<num......
  • C++学习随笔——关联容器的迭代器失效问题
    常见关联容器的迭代器失效规则std::map和std::set:插入元素:插入新元素不会使任何已有的迭代器失效。你可以在插入新元素后继续使用所有现有的迭代器。删除元素:删除某个元素会导致指向该元素的迭代器失效。除此之外,所有指向其他元素的迭代器仍然有效。如果在遍历过程中删除......
  • 从零开始学习C++之递归
    递归注:此算法与函数有关,如不了解请移步。在wikipedia中,递归的解释是这样的:在C++中,递归就是指在函数中调用函数本身;递归的作用类似于分治,将一个大问题分解为很多小问题进行求解。但是递归的时间复杂度极高,因为要解决很多小问题,所以时间复杂度高达\(O(2^n)\)。使用递......
  • C++/Qt 多媒体(续二)
    一、前言        前边讲述到了Qt的两项独特的模块编程支持的另一项内容——多媒体编程,上篇文章具体讲述的包括一个QMediaPlayer类的示例代码和一个QSoundEffect类的讲解,而本章将会提供一篇示例代码——《基于QMediaRecorder类的音频录制》。    对于上篇内......
  • C++面试基础系列-this指针
    系列文章目录文章目录系列文章目录C++面试基础系列-this指针Overview1.this指针1.1.特性1.2.用法1.3.注意事项2.使用'this'指针的多态类的示例3.在C++中,指针和对象本身有什么区别?关于作者C++面试基础系列-this指针Overview1.this指针在C++中,this指针是一......
  • c/c++代码流程图生成
    以下介绍2款皆免费1.cxx2flow【github项目】c/c++函数解析为dot然后通过Graphviz渲染项目有附带gui程序可直接生成流程图,但是显示效果缩放不太行,建议解析生成dot后喂给其他基于Graphviz的渲染服务,使用过vscode上面的graphviz-interactive-preview,效果还行,也有在线网页渲染......
  • threeJs 修改TransformControls的显示位置
    有的时候模型的原点不是自身中心而是在场景的[0,0,0]位置这个时候想要让TransformControls的位置显示在模型的中心目前找的的处理方式是修改源码找到updateMatrixWorld方法updateMatrixWorld(){...for(leti=0;i<handles.length;i++){ ... if(this......
  • 【编程规范具体案例(基于Qt、微软、谷歌和AUTOSAR C++14 参考)】 C++ 编码规范 之并发篇
    目录标题并发目录12.并发编程规范12.1线程创建与管理规则12.1.1\[必须]明确定义线程的生命周期管理策略12.1.2\[必须]为关键线程设置明确的标识符12.1.3\[必须]在多线程环境中安全地处理异常12.2线程同步规则12.2.1\[必须]使用线程安......