目录
1. 说明
std::transform 是一种多功能算法,用于将已知函数应用于一个或多个范围内的元素,并将结果存储在输出范围内。它主要有两种形式:一元运算和二元运算。具体来说是在 <algorithm> 标头中。函数声明:
template< class InputIt, class OutputIt, class UnaryOp > OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, UnaryOp unary_op ); |
(1) |
(constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class UnaryOp > ForwardIt2 d_first, UnaryOp unary_op ); |
(2) |
(since C++17) |
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOp > OutputIt d_first, BinaryOp binary_op ); |
(3) |
(constexpr since C++20) |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, ForwardIt3 d_first, BinaryOp binary_op ); |
(4) |
(since C++17) |
一元操作的函数相当于:Ret fun(const Type &a);
二元操作的函数相当于:Ret fun(const Type1 &a, const Type2 &b);
即传进去的是一个函数对象。
2. 用法示例
#include <algorithm>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>
void print_ordinals(const std::vector<unsigned>& ordinals)
{
std::cout << "ordinals: ";
for (unsigned ord : ordinals)
std::cout << std::setw(3) << ord << ' ';
std::cout << '\n';
}
char to_uppercase(unsigned char c)
{
return std::toupper(c);
}
void to_uppercase_inplace(char& c)
{
c = to_uppercase(c);
}
void unary_transform_example(std::string& hello, std::string world)
{
// 将string就地转化为大写形式
std::transform(hello.cbegin(), hello.cend(), hello.begin(), to_uppercase);
std::cout << "hello = " << std::quoted(hello) << '\n';
// for_each version (see Notes above)
std::for_each(world.begin(), world.end(), to_uppercase_inplace);
std::cout << "world = " << std::quoted(world) << '\n';
}
void binary_transform_example(std::vector<unsigned> ordinals)
{
// 将数转换为double
print_ordinals(ordinals);
std::transform(ordinals.cbegin(), ordinals.cend(), ordinals.cbegin(),
ordinals.begin(), std::plus<>{});
//或使用 std::plus<>()
print_ordinals(ordinals);
}
int main()
{
std::string hello("hello");
unary_transform_example(hello, "world");
std::vector<unsigned> ordinals;
std::copy(hello.cbegin(), hello.cend(), std::back_inserter(ordinals));
binary_transform_example(std::move(ordinals));
}
输出:
hello = "HELLO"
world = "WORLD"
ordinals: 72 69 76 76 79
ordinals: 144 138 152 152 158
说明:std::quoted 是 C++14 中引入的 I/O 操作符,属于 <iomanip> 库的一部分。其主要目的是简化使用流进行输入输出操作时对带引号的字符串的处理。