std::copy_n
From cppreference.com
| ヘッダー <algorithm> で定義 |
||
| template< class InputIt, class Size, class OutputIt > OutputIt copy_n( InputIt first, Size count, OutputIt result ); |
(1) | (C++11以降) (C++20 以降 constexpr) |
| template< class ExecutionPolicy, class ForwardIt1, class Size, class ForwardIt2 > |
(2) | (C++17以降) |
1) first で始まる範囲から count 個の値を正確に result で始まる範囲にコピーします。形式的には、
[0, count) の各整数 i に対して、*(result + i) = *(first + i) を実行します。 範囲の重複は形式的には許可されていますが、結果の順序が予測不能になります。
2) (1) と同じですが、policy に従って実行されます。
このオーバーロードは、以下のすべての条件が満たされた場合にのみオーバーロード解決に参加します。
|
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> は true です。 |
(C++20まで) |
|
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> は true です。 |
(C++20以降) |
目次 |
[編集] パラメーター
| first | - | コピー元の要素範囲の先頭 |
| count | - | コピーする要素の数 |
| 結果 | - | コピー先範囲の先頭 |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たす必要があります。 | ||
-OutputIt は LegacyOutputIterator の要件を満たさなければなりません。 | ||
-ForwardIt1, ForwardIt2 は LegacyForwardIterator の要件を満たさなければなりません。 | ||
[編集] 戻り値
コピー先の範囲のイテレータ。 count > 0 の場合は最後にコピーされた要素の次を指し、それ以外の場合は result を指します。
[編集] 計算量
count < 0 の場合は0回の代入、それ以外の場合は count 回の代入。
[編集] 例外
テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、次のようにエラーを報告します。
- アルゴリズムの一部として呼び出された関数の実行が例外をスローし、
ExecutionPolicyが 標準ポリシー のいずれかである場合、std::terminate が呼び出されます。その他のExecutionPolicyの場合、動作は実装定義です。 - アルゴリズムがメモリの割り当てに失敗した場合、std::bad_alloc がスローされます。
[編集] 可能な実装
template<class InputIt, class Size, class OutputIt> constexpr //< since C++20 OutputIt copy_n(InputIt first, Size count, OutputIt result) { if (count > 0) { *result = *first; ++result; for (Size i = 1; i != count; ++i, (void)++result) *result = *++first; } return result; } |
[編集] 例
このコードを実行
#include <algorithm> #include <iostream> #include <iterator> #include <numeric> #include <string> #include <vector> int main() { std::string in {"1234567890"}; std::string out; std::copy_n(in.begin(), 4, std::back_inserter(out)); std::cout << out << '\n'; std::vector<int> v_in(128); std::iota(v_in.begin(), v_in.end(), 1); std::vector<int> v_out(v_in.size()); std::copy_n(v_in.cbegin(), 100, v_out.begin()); std::cout << std::accumulate(v_out.begin(), v_out.end(), 0) << '\n'; }
出力
1234 5050
[編集] 関連項目
| (C++11) |
要素の範囲を新しい場所にコピーする (関数テンプレート) |
| (C++20) |
指定された数の要素を新しい場所にコピーする (アルゴリズム関数オブジェクト) |