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

C++ STL泛型算法之transform

std::transform

是 C++ STL 中的一个算法,用于对 一个或两个范围(区间) 内的元素应用指定的操作,并将结果存储在输出范围中。它是泛型算法,可以用于 std::vector、std::string、std::array 等容器。

1. 一元运算

transform(Iterator inputBegin, Iterator inputEnd,Iterator OutputBegin, unary_operation); 

Iterator inputBegin(输入起始迭代器):要转换的元素起始位置
Iterator inputEnd(输入结束迭代器):要转换的元素结束位置(不包含)
Iterator OutputBegin(输出起始迭代器):转换后的结果存储的位置(可以与输入相同)
unary_operation(操作函数):对每个元素应用的转换函数(可以是 标准库函数、普通函数、Lambda 表达式 或 函数对象)

2. 二元运算

transform(Iterator inputBegin1, Iterator inputEnd1,Iterator inputBegin2, 
              Iterator OutputBegin, binary_operation); 

Iterator inputBegin1(输入起始迭代器1):要转换的元素起始位置1
Iterator inputEnd1(输入结束迭代器1):要转换的元素结束位置(不包含)1
Iterator inputBegin2(输入起始迭代器2):要转换的元素起始位置2
Iterator OutputBegin(输出起始迭代器):转换后的结果存储的位置(可以与输入相同)
binary_operation(操作函数):对每个元素应用的转换函数(可以是 标准库函数、普通函数、Lambda 表达式 或 函数对象)

例1. 使用普通函数
#include <iostream>
#include <algorithm>
#include <string>

int main() {
    std::string str = "Hello, World!";
    std::transform(str.begin(), str.end(), str.begin(), ::tolower);
    std::cout << str << std::endl;  // 输出: hello, world!
    return 0;
}
例2. 使用Lambda 表达式
#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::vector<int> result(nums.size());  // 结果数组
    // 计算每个元素的平方
    std::transform(nums.begin(), nums.end(), result.begin(), [](int x) { return x * x; });
    for (int x : result) std::cout << x << " ";  // 输出: 1 4 9 16 25
    return 0;
}
例3. 使用普通函数
#include <iostream>
#include <vector>
#include <algorithm>

// 自定义函数,将数字翻倍
int doubleNum(int x) {
    return x * 2;
}

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::vector<int> result(nums.size());
    std::transform(nums.begin(), nums.end(), result.begin(), doubleNum);
    for (int x : result) std::cout << x << " ";  // 输出: 2 4 6 8 10
    return 0;
}
例4. 使用函数对象
#include <iostream>
#include <vector>
#include <algorithm>

// 自定义仿函数,计算立方
struct Cube {
    int operator()(int x) const {
        return x * x * x;
    }
};

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::vector<int> result(nums.size());
    std::transform(nums.begin(), nums.end(), result.begin(), Cube());
    for (int x : result) std::cout << x << " ";  // 输出: 1 8 27 64 125
    return 0;
}
例5. 双输入

对两个vector内的元素逐个进行操作,并存储到第三个vector中

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> a = {1, 2, 3, 4, 5};
    std::vector<int> b = {10, 20, 30, 40, 50};
    std::vector<int> result(a.size());
    // 逐个元素相加
    std::transform(a.begin(), a.end(), b.begin(), result.begin(), [](int x, int y) { return x + y; });
    for (int x : result) std::cout << x << " ";  // 输出: 11 22 33 44 55
    return 0;
}

3. transform 和 back_inserter

back_inserter(result) 让 result 通过 push_back() 自动扩展,而不需要预分配大小。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5};
    std::vector<int> result;
    std::transform(nums.begin(), nums.end(), std::back_inserter(result), [](int x) { return x * 2; });
    for (int x : result) std::cout << x << " ";  // 输出: 2 4 6 8 10
    return 0;
}

4. for_each 和 transform

选择 for_each 还是 transform,取决于是否需要修改数据

// std::for_each
std::for_each(vec.begin(), vec.end(), [](int &x) { x *= 2; });  // 修改原数据
// std::transform
std::transform(vec.begin(), vec.end(), newVec.begin(), [](int x) { return x * 2; });  // 生成新数据
任务用法
打印元素for_each
修改原数据for_each(传 &)
创建新序列transform
两个容器transform(双输入)

相关文章:

  • 数据库原理3
  • 服务降级的理解
  • 测试工程师知识总结(黑马课程软件测试基础)
  • 在Linux环境部署SpringBoot项目
  • nnUNet报错
  • 【Linux第三弹】Linux基础指令 (下)
  • 电商业务数据测试用例参考
  • 一周学会Flask3 Python Web开发-WTForms表单验证
  • Libgdx游戏开发系列教程(4)——显示中文文字
  • PARETO PROMPT OPTIMIZATION
  • 蓝桥杯每日一题:第一周周四哞叫时间
  • 基于 LeNet 网络的 MNIST 数据集图像分类
  • MicroServer Gen8再玩之三 OCP万兆光口+12G阵列卡
  • PPT 小黑第29套
  • C/C++中函数指针和指针函数的原理和区别是什么,分别通过用例说明。
  • [Python学习日记-85] 并发编程之多进程 —— Process 类、join 方法、僵尸进程与孤儿进程
  • 两个四元数叉乘与姿态旋转的关系
  • 抽奖系统(从0-1)(上)
  • node版本切换工具【nvm】
  • 大数据学习(55)-BI工具数据分析的使用
  • 辽宁学网站建设专业学校/电商运营培训哪个机构好
  • 太原网站建设公司招聘/网站设计公司排行
  • 住房城乡建设委(房管局)官方网站/免费发链接的网站
  • 襄阳网站seo厂家/360推广登录平台
  • 深圳市政府网站建设公司/外链网址
  • 小小影视大全免费高清版/专业的seo搜索引擎优化培训