Yukyukuon / blog

博客的文章
1 stars 0 forks source link

C++的一些函数操作 #10

Open Yukyukuon opened 3 years ago

Yukyukuon commented 3 years ago

在此文章记录一些在C++中遇到的一些操作笔记

目录

std::transform

std::transform在指定的范围内应用于给定的操作,并将结果存储在指定的另一个范围内。要使用std::transform函数需要包含头文件。 \ std::transform有两种用法:

方法1: 对应于一元操作

template <class InputIterator, class OutputIterator, class UnaryOperation>
  OutputIterator transform (InputIterator first1, InputIterator last1, 
            OutputIterator result, UnaryOperation op);

对于一元操作,将op应用于[first1, last1)范围内的每个元素,并将每个操作返回的值存储在以result开头的范围内。给定的op将被连续调用last1-first1次。op可以是函数指针或函数对象或lambda表达式。

如op的一个实现 即将[first1, last1)范围内的每个元素加5,然后依次存储到result中。

int op_add(int, a, int b) {return (a + b)};
// 调用std::transform的方法
std::transform(first1, last1, first2, result, op_add);

方法2: 对于二元操作

template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
  OutputIterator transform (InputIterator1 first1, InputIterator1 last1, 
       InputIterator2 first2, OutputIterator result, BinaryOperation binary_op);

对于二元操作,使用[first1, last1)范围内的每个元素作为第一个参数调用binary_op,并以first2开头的范围内的每个元素作为第二个参数调用binary_op,每次调用返回的值都存储在以result开头的范围内。给定的binary_op将被连续调用last1-first1次。binary_op可以是函数指针或函数对象或lambda表达式。

如binary_op的一个实现即将first1和first2开头的范围内的每个元素相加,然后依次存储到result中。

int op_add(int, a, int b) {return (a + b)};
std::transform(first1, last1, first2, result, op_add);

std::transform支持in place,即result和first1指向的位置可以是相同的。std::transform的主要作用应该就是省去了我们自己写for循环实现。