std::transform

来自cppreference.com
< cpp‎ | algorithm

 
 
算法库
执行策略 (C++17)
不修改的序列操作
(C++11)
(C++11)
(C++11)
(C++17)
修改的序列操作
(C++11)
(C++11)
transform

未初始化存储上的操作
划分操作
排序操作
(C++11)
二分查找操作
集合操作(在已排序范围上)
堆操作
(C++11)
最小/最大操作
(C++11)
(C++17)

重排
数值操作
C 库
 
定义于头文件 <algorithm>
template< class InputIt, class OutputIt, class UnaryOperation >

OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first,

                    UnaryOperation unary_op );
(1)
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >

OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2,

                    OutputIt d_first, BinaryOperation binary_op );
(2)
std::transform施加给定的功能的范围内,并存储在另一个范围内的结果,开始在d_first.
原文:
std::transform applies the given function to a range and stores the result in another range, beginning at d_first.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
在第一个版本的一元运算unary_op被施加到限定的范围内由[first1, last1)。在第二个版本的二进制运算binary_op元素对被施加到从两个范围:1定义的和其他的开始[first1, last1)first2.
原文:
In the first version unary operation unary_op is applied to the range defined by [first1, last1). In the second version the binary operation binary_op is applied to pairs of elements from two ranges: one defined by [first1, last1) and the other beginning at first2.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

目录

[编辑] 参数

first1, last1 -
第一个范围的元素进行改造
原文:
the first range of elements to transform
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
first2 -
变换的元素的第二范围的开头
原文:
the beginning of the second range of elements to transform
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
d_first -
目标范围的开始,可以等于first1first2
原文:
the beginning of the destination range, may be equal to first1 or first2
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
unary_op - 将要应用的一元算符函数。
函数签名应等价于如下者:

 Ret fun(const Type &a);

签名不必有 const &
类型 Type 必须使得 InputIt 类型对象能在解引用后隐式转换到 Type 。 类型 Ret 必须使得能解引用 OutputIt 类型对象并对它赋 Ret 类型值。 ​

binary_op - 被使用的二元函数对象。

该函数的签名应当等价于:

 Ret fun(const Type1 &a, const Type2 &b);

签名中并不需要有 const &
类型 Type1Type2 必须使得 InputIt1InputIt2 类型的对象在解引用后各能隐式转换到 Type1Type2 。 类型 Ret 必须使得能解引用 OutputIt 类型对象并对它赋 Ret 类型值。 ​

类型要求
-
InputIt 必须满足 InputIterator 的要求。
-
InputIt1 必须满足 InputIterator 的要求。
-
InputIt2 必须满足 InputIterator 的要求。
-
OutputIt 必须满足 OutputIterator 的要求。

[编辑] 返回值

输出迭代器改变了过去的最后一个元素的元素.
原文:
output iterator to the element past the last element transformed.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 复杂度

1)
究竟std::distance(first1, last1)应用unary_op
原文:
exactly std::distance(first1, last1) applications of unary_op
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
2)
究竟std::distance(first1, last1)应用binary_op
原文:
exactly std::distance(first1, last1) applications of binary_op
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 要求

unary_opbinary_op没有任何副作用。 (C++11 前)
原文:
unary_op and binary_op have no side effects. (C++11 前)
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
unary_opbinary_op没有任何迭代器失效,其中包括结束迭代器,或修改任何元素所涉及的范围。 (C++11 起)
原文:
unary_op and binary_op do not invalidate any iterators, including the end iterators, or modify any elements of the ranges involved. (C++11 起)
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。
这些规定的目的是让平行或序std::transform实现。应用功能有序的序列,使用std::for_each.
原文:
The intent of these requirements is to allow parallel or out-of-order implementations of std::transform. To apply a function to a sequence in-order, use std::for_each.
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

[编辑] 可能的实现

版本一
template<class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, 
                   UnaryOperation unary_op)
{
    while (first1 != last1) {
        *d_first++ = unary_op(*first1++);
    }
    return d_first;
}
版本二
template<class InputIt1, class InputIt2, 
         class OutputIt, class BinaryOperation>
OutputIt transform(InputIt first1, InputIt last1, InputIt first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}

[编辑] 示例

下面的代码使用转换将字符串转换为大写toupper函数的使用
原文:
The following code uses transform to convert a string to uppercase using the toupper function:
文本通过谷歌翻译机器翻译。
你可以帮忙校正和验证翻译。点击此处查看指示。

#include <string>
#include <cctype>
#include <algorithm>
#include <iostream>
 
int main()
{
    std::string s("hello");
    std::transform(s.begin(), s.end(), s.begin(), (int (*)(int))std::toupper);
    std::cout << s;
 }

输出:

HELLO

[编辑] 另请参阅

将一个函数应用于某一范围的元素
(函数模板) [编辑]