std::transform
| ヘッダ <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 から始まる別の範囲に格納します。
unary_op が [first1, last1) で定義される範囲に適用されます。binary_op が [first1, last1) で定義される範囲と first2 から始まる範囲の2つの範囲の要素の組に適用されます。policy に従って実行されます。 このオーバーロードは、 std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> が true である場合にのみ、オーバーロード解決に参加します
|
|
(C++11未満) |
|
|
(C++11以上) |
引数
| first1, last1 | - | 変換する要素の1つめの範囲 |
| first2 | - | 変換する要素の2つめの範囲の先頭 |
| d_first | - | コピー先範囲の先頭、 first1 または first2 と等しくても構いません
|
| policy | - | 使用する実行ポリシー。 詳細は実行ポリシーを参照してください |
| unary_op | - | 適用される単項演算関数オブジェクト。 この関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| binary_op | - | 適用される二項演算関数オブジェクト。 関数のシグネチャは以下と同等であるべきです。
シグネチャが |
| 型の要件 | ||
-InputIt, InputIt1, InputIt2 は LegacyInputIterator の要件を満たさなければなりません。
| ||
-OutputIt は LegacyOutputIterator の要件を満たさなければなりません。
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 は LegacyForwardIterator の要件を満たさなければなりません。
| ||
戻り値
最後に変換した要素の次の要素を指す出力イテレータ。
計算量
std::distance(first1, last1) 回の unary_op の適用。std::distance(first1, last1) 回の binary_op の適用。例外
テンプレート引数 ExecutionPolicy を持つオーバーロードは以下のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外を投げ、
ExecutionPolicyが標準のポリシーのいずれかの場合は、 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::transform は unary_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
関連項目
| 指定範囲の要素に関数を適用します (関数テンプレート) |