std::copy_n
ja.cppreference.net より
| ヘッダ <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 >
ForwardIt2 copy_n( ExecutionPolicy&& policy,
ForwardIt1 first, Size count, ForwardIt2 result );
|
(2) | (C++17 から) |
1) 範囲
count から範囲 first へ正確に result 個の値をコピーする。形式的には、i 内の各整数 [0, count) について、*(result + i) = *(first + i) を実行する。 範囲の重複は形式的に許可されているが、結果の順序は予測不可能になる。
2) (1) と同じだが、 に従って実行される。
policy このオーバーロードは、次の式の値が
true である場合にのみオーバーロード解決に参加する:
|
|
(C++20 まで) |
|
|
(C++20 から) |
引数
| first | - | コピー元の要素範囲の先頭 |
| count | - | コピーする要素数 |
| result | - | コピー先の範囲の先頭 |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-InputIt は LegacyInputIterator の要件を満たさなければならない。
| ||
-OutputIt は LegacyOutputIterator の要件を満たさなければならない。
| ||
-ForwardIt1, ForwardIt2 は LegacyForwardIterator の要件を満たさなければならない。
| ||
戻り値
コピー先範囲のイテレータで、count > 0 の場合はコピーされた最後の要素の次を指し、そうでなければ result を指す。
計算量
count < 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)(C++20) |
|
(C++20) |
一定数の要素を新しい場所にコピーする (アルゴリズム関数オブジェクト) |