名前空間
変種
操作

std::transform

提供: cppreference.com
< cpp‎ | algorithm
 
 
アルゴリズムライブラリ
実行ポリシー (C++17)
非変更シーケンス操作
(C++11)(C++11)(C++11)
(C++17)
変更シーケンス操作
(C++11)
(C++11)
(C++20)(C++20)
transform
未初期化記憶域の操作
分割操作
ソート操作
(C++11)
二分探索操作
集合操作 (ソート済み範囲用)
ヒープ操作
(C++11)
最小/最大演算
(C++11)
(C++17)
順列
数値演算
C のライブラリ
 
ヘッダ <algorithm> で定義
(1)
template< class InputIt, class OutputIt, class UnaryOperation >

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

                    UnaryOperation unary_op );
(C++20以前)
template< class InputIt, class OutputIt, class UnaryOperation >

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

                              UnaryOperation unary_op );
(C++20およびそれ以降)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class UnaryOperation >

ForwardIt2 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

                    ForwardIt2 d_first, UnaryOperation unary_op );
(2) (C++17およびそれ以降)
(3)
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >

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

                    OutputIt d_first, BinaryOperation binary_op );
(C++20以前)
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation >

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

                              OutputIt d_first, BinaryOperation binary_op );
(C++20およびそれ以降)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class ForwardIt3, class BinaryOperation >

ForwardIt3 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1,

                    ForwardIt2 first2, ForwardIt3 d_first, BinaryOperation binary_op );
(4) (C++17およびそれ以降)

std::transform は、指定された関数を範囲に適用し、その結果を d_first から始まる別の範囲に格納します。

1) 単項演算 unary_op[first1, last1) で定義される範囲に適用されます。
3) 二項演算 binary_op[first1, last1) で定義される範囲と first2 から始まる範囲の2つの範囲の要素の組に適用されます。
2,4) (1,3) と同じですが、 policy に従って実行されます。 このオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true である場合にのみ、オーバーロード解決に参加します

unary_op および binary_op は副作用を持ってはなりません。

(C++11以前)

unary_op および binary_op はいかなるイテレータ (終端イテレータを含む) も無効化してはならず、影響のある範囲のいかなる要素も変更してはなりません。

(C++11およびそれ以降)

目次

[編集] 引数

first1, last1 - 変換する要素の1つめの範囲
first2 - 変換する要素の2つめの範囲の先頭
d_first - コピー先範囲の先頭、 first1 または first2 と等しくても構いません
policy - 使用する実行ポリシー。 詳細は実行ポリシーを参照してください
unary_op - 適用される単項演算関数オブジェクト。

この関数のシグネチャは以下と同等であるべきです。

 Ret fun(const Type &a);

シグネチャが const & を持つ必要はありません。
TypeInputIt 型のオブジェクトの逆参照から暗黙に変換可能なものでなければなりません。 型 RetOutputIt 型のオブジェクトの逆参照に代入可能なものでなければなりません。 ​

binary_op - 適用される二項演算関数オブジェクト。

関数のシグネチャは以下と同等であるべきです。

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

シグネチャが const & を持つ必要はありません。
Type1 および Type2 は、 InputIt1 および InputIt2 型のオブジェクトの逆参照からType1 および Type2 にそれぞれ暗黙に変換可能なものでなければなりません。 型 RetOutputIt 型のオブジェクトの逆参照に代入可能なものでなければなりません。 ​

型の要件
-
InputIt, InputIt1, InputIt2InputIterator の要件を満たさなければなりません。
-
OutputItOutputIterator の要件を満たさなければなりません。
-
ForwardIt1, ForwardIt2, ForwardIt3ForwardIterator の要件を満たさなければなりません。

[編集] 戻り値

最後に変換した要素の次の要素を指す出力イテレータ。

[編集] 計算量

1-2) ちょうど std::distance(first1, last1) 回の unary_op の適用。
3-4) ちょうど std::distance(first1, last1) 回の binary_op の適用。

[編集] 例外

テンプレート引数 ExecutionPolicy を持つオーバーロードは以下のようにエラーを報告します。

  • アルゴリズムの一部として呼び出された関数の実行が例外を投げ、 ExecutionPolicy が3つの標準のポリシーのいずれかの場合は、 std::terminate が呼ばれます。 それ以外のあらゆる ExecutionPolicy については、動作は処理系定義です。
  • アルゴリズムがメモリの確保に失敗した場合は、 std::bad_alloc が投げられます。

[編集] 実装例

1つめのバージョン
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;
}
2つめのバージョン
template<class InputIt1, class InputIt2, 
         class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
                   OutputIt d_first, BinaryOperation binary_op)
{
    while (first1 != last1) {
        *d_first++ = binary_op(*first1++, *first2++);
    }
    return d_first;
}

[編集] ノート

std::transformunary_op または binary_op が順番に適用されることは保証しません。 シーケンスに順番に関数を適用するため、またはシーケンスの要素を変更する関数を適用するためには、 std::for_each を使用してください。

[編集]

以下のコードは toupper 関数を使用して文字列をその場で大文字に変換するために transform を使用し、その後、各文字を序数値に変換します。

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
#include <vector>
 
int main()
{
    std::string s("hello");
    std::transform(s.begin(), s.end(), s.begin(),
                   [](unsigned char c) -> unsigned char { return std::toupper(c); });
 
    std::vector<std::size_t> ordinals;
    std::transform(s.begin(), s.end(), std::back_inserter(ordinals),
                   [](unsigned char c) -> std::size_t { return c; });
 
    std::cout << s << ':';
    for (auto ord : ordinals) {
       std::cout << ' ' << ord;
    }
}

出力:

HELLO: 72 69 76 76 79

[編集] 関連項目

指定範囲の要素に関数を適用します
(関数テンプレート) [edit]