std::transform
ヘッダ <algorithm> で定義
|
||
(1) | ||
template< class InputIt, class OutputIt, class UnaryOperation > OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, |
(C++20未満) | |
template< class InputIt, class OutputIt, class UnaryOperation > constexpr OutputIt transform( InputIt first1, InputIt last1, OutputIt d_first, |
(C++20以上) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class UnaryOperation > ForwardIt2 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, |
(2) | (C++17以上) |
(3) | ||
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, |
(C++20未満) | |
template< class InputIt1, class InputIt2, class OutputIt, class BinaryOperation > constexpr OutputIt transform( InputIt1 first1, InputIt1 last1, InputIt2 first2, |
(C++20以上) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class ForwardIt3, class BinaryOperation > ForwardIt3 transform( ExecutionPolicy&& policy, ForwardIt1 first1, ForwardIt1 last1, |
(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 | - | 適用される単項演算関数オブジェクト。 この関数のシグネチャは以下と同等であるべきです。 Ret fun(const Type &a); シグネチャが const & を持つ必要はありません。 |
binary_op | - | 適用される二項演算関数オブジェクト。 関数のシグネチャは以下と同等であるべきです。 Ret fun(const Type1 &a, const Type2 &b); シグネチャが const & を持つ必要はありません。 |
型の要件 | ||
-InputIt, InputIt1, InputIt2 は LegacyInputIterator の要件を満たさなければなりません。
| ||
-OutputIt は LegacyOutputIterator の要件を満たさなければなりません。
| ||
-ForwardIt1, ForwardIt2, ForwardIt3 は LegacyForwardIterator の要件を満たさなければなりません。
|
[編集] 戻り値
最後に変換した要素の次の要素を指す出力イテレータ。
[編集] 計算量
[編集] 例外
テンプレート引数 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
[編集] 関連項目
指定範囲の要素に関数を適用します (関数テンプレート) |