std::transform

std::transformC++ 标准库中的一个算法,定义在 <algorithm> 头文件中。它用于对给定范围内的元素进行转换操作,并将结果存储到另一个范围中。std::transform 可以用于对容器中的元素进行逐元素操作,例如将每个元素加 1、转换为大写字母等。

(1)对输入范围 [first1, last1) 中的每个元素应用一元操作 unary_op,并将结果存储到以 d_first 开始的目标范围。

template< class InputIt, class OutputIt, class UnaryOperation >
OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op );

(2)对两个输入范围 [first1, last1)[first2, first2 + (last1 - first1)) 中的对应元素应用二元操作 binary_op,并将结果存储到以 d_first 开始的目标范围。

template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >
OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op );

(1)first1, last1:第一个输入范围的起始和结束迭代器。

(2)first2:第二个输入范围的起始迭代器(仅用于二元操作版本)。

(3)d_first:目标范围的起始迭代器,用于存储转换结果。

(4)unary_op:一元操作函数,接受一个参数并返回转换后的值。

(5)binary_op:二元操作函数,接受两个参数并返回转换后的值。

(6)返回目标范围的结束迭代器(即 d_first + (last1 - first1))。

#include <iostream>
#include <vector>
#include <algorithm> // std::transform

int main() {
    std::vector<int> src = {1, 2, 3, 4, 5};
    std::vector<int> dst(src.size()); // 目标容器,大小与源容器相同

    // 对每个元素加 1
    std::transform(src.begin(), src.end(), dst.begin(), [](int x) {
        return x + 1;
    });

    // 输出结果
    for (int i : dst) {
        std::cout << i << " "; // 输出: 2 3 4 5 6
    }
    return 0;
}
#include <iostream>
#include <vector>
#include <algorithm> // std::transform

int main() {
    std::vector<int> src1 = {1, 2, 3, 4, 5};
    std::vector<int> src2 = {10, 20, 30, 40, 50};
    std::vector<int> dst(src1.size()); // 目标容器,大小与源容器相同

    // 将两个范围的对应元素相加
    std::transform(src1.begin(), src1.end(), src2.begin(), dst.begin(), [](int a, int b) {
        return a + b;
    });

    // 输出结果
    for (int i : dst) {
        std::cout << i << " "; // 输出: 11 22 33 44 55
    }
    return 0;
}
#include <iostream>
#include <string>
#include <algorithm> // std::transform
#include <cctype>    // std::toupper

int main() {
    std::string str = "hello, world!";
    std::string result(str.size(), '\0'); // 目标字符串,大小与源字符串相同

    // 将字符串中的每个字符转换为大写
    std::transform(str.begin(), str.end(), result.begin(), [](unsigned char c) {
        return std::toupper(c);
    });

    // 输出结果
    std::cout << result << std::endl; // 输出: HELLO, WORLD!
    return 0;
}

(1)目标范围的大小:目标范围必须有足够的空间来存储转换结果,否则会导致未定义行为。
(2)可以使用 std::back_inserter 动态扩展目标容器(如 std::vector)。

std::vector<int> dst;
std::transform(src.begin(), src.end(), std::back_inserter(dst), [](int x) {
    return x + 1;
});

(3)std::transform 是高效的,因为它会对范围内的每个元素应用操作,且没有额外的开销。
(4)操作函数的返回值:操作函数(unary_op 或 binary_op)的返回值类型必须与目标容器的元素类型兼容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值