C++11 std::transform函数使用说明

本文介绍了C++标准库中的std::transform算法,它定义在algorithm头文件中,可对输入范围元素操作并将结果存于输出范围,适合数据类型转换。文中给出其基本语法,还通过示例展示如何用lambda函数将输入元素乘2并存储结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

std::transform是C++标准库中的一个算法,它用于对输入范围内的元素进行操作,并将结果存储在输出范围内。这个算法特别适合于将一种数据类型转换为另一种数据类型。
函数定义在头文件algorithm中

std::transform的基本语法如下:

std::transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation 
unary_op);

或者

std::transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op);

其中:

  • first1 和 last1 是输入范围的迭代器,指定了要进行操作的元素范围。
  • d_first 是输出范围的起始迭代器,std::transform将结果存储在此位置开始的位置。
  • unary_op 是一个一元操作函数(或函数指针、函数对象),它定义了对输入元素进行操作的方式。
  • binary_op 是一个二元操作函数(或函数指针、函数对象),它定义了如何将两个输入元素操作以产生一个输出元素。


下面是一个简单的例子,我们将使用 std::transform 将一个输入范围中的每个元素乘以2,并将结果存储在输出范围中:

#include <algorithm>  
#include <vector>  
#include <iostream>  
#include <iterator>
  
int main() {  
    // int数组处理,每个项乘以10
    std::vector<int> inputs = {1, 2, 3, 4};
    std::vector<int> outputs(inputs.size());
    // 使用transform处理
    std::transform(inputs.begin(), inputs.end(), outputs.begin(), [](int x){return x*10;});
    // 输出
    std::copy(outputs.begin(), outputs.end(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;


    std::string str =  "hello world!";
    // 将string转大写
    std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c){return std::toupper(c);});
    // 输出
    std::copy(str.begin(), str.end(), std::ostream_iterator<unsigned char>(std::cout, " "));
    std::cout << std::endl;


    std::vector<std::string> sinputs = {"abc", "jhk", "hello", "workd"};
    std::vector<std::string> soutpus(sinputs.size());
    // 将string数组转大写
    std::transform(sinputs.begin(), sinputs.end(), soutpus.begin(), [](std::string s){ for(auto &el : s)el = std::toupper(el); return s;});
    // 输出
    std::copy(soutpus.begin(), soutpus.end(), std::ostream_iterator<std::string>(std::cout, ","));
    std::cout << std::endl;
  
    return 0;  
}

在这个例子中,我们使用了一个 lambda 函数 [](int x) { return x * 2; } 作为一元操作函数。这个 lambda 函数接收一个整数参数 x,并返回 x * 2。我们把这个 lambda 函数传递给 std::transform,以便它能够对输入范围中的每个元素执行这个操作。然后,结果被存储在 output 向量中。

运行上述程序,你将看到输出:2 4 6 8 10,这是输入范围中的每个元素乘以2后的结果。

### C++ 中 `std::transform` 的用法 `std::transform` 是 C++ 标准库中的一个重要算法,位于头文件 `<algorithm>` 中。此函数用于将某个范围内的元素通过指定的操作转换并存储到另一个范围内。 #### 单一输入序列变换 当处理单一输入序列时,`std::transform` 可以接受两个迭代器定义的源区间以及目标区间的起始位置,再加上一个用于描述如何转换每个元素的一元操作。下面的例子展示了如何利用 lambda 表达式来创建一个新的整数向量,其值为原向量各元素平方后的结果[^1]: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> original = {1, 2, 3, 4, 5}; std::vector<int> squared(original.size()); std::transform( original.begin(), original.end(), squared.begin(), [](const int& value) -> int { return value * value; } ); for(auto val : squared){ std::cout << val << " "; } return 0; } ``` 这段代码会输出:`1 4 9 16 25` #### 多重输入序列变换 对于涉及多个输入序列的情况,则需要提供四个迭代器参数——前三个分别指向第一个和第二个源区间的起点及终点,最后一个是指定的目标区域开头;此外还需要二元运算符说明怎样组合来自不同集合的数据项。这里给出一段示范程序,它计算两数组对应位置数值之积,并存入第三个容器内: ```cpp #include <iostream> #include <vector> #include <algorithm> int main(){ std::vector<int> vecA = {1, 2, 3}, vecB = {4, 5, 6}; std::vector<int> product(vecA.size()); std::transform( vecA.begin(), vecA.end(), vecB.begin(), product.begin(), std::multiplies<int>() ); for(int i : product){ std::cout << i << ' '; } return 0; } ``` 上述实例将会打印出:`4 10 18`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

telllong

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值