Namespaces
Variants

std::copy_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に対するアルゴリズム (C++20)
制約付きアルゴリズム(例:ranges::copy, ranges::sort, ...)
ソートおよび関連操作
分割操作
(C++11)    

ソート操作
二分探索操作
(分割された範囲に対する)
集合操作(ソート済み範囲に対する)
マージ操作(ソート済み範囲に対する)
ヒープ操作
最小値/最大値操作
(C++11)
(C++17)
辞書順比較操作
順列操作


 
ヘッダ <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 である場合にのみオーバーロード解決に参加する:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(C++20 まで)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(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

関連項目

要素範囲を新しい場所にコピーする
(関数テンプレート & アルゴリズム関数オブジェクト)
一定数の要素を新しい場所にコピーする
(アルゴリズム関数オブジェクト)