Namespaces
Variants

std::fill_n

ja.cppreference.net から
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジに対するアルゴリズム (C++20)
制約付きアルゴリズム、例:ranges::copy、ranges::sort、...
ソートと関連操作
分割操作
(C++11)    

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


 
ヘッダ <algorithm>
template< class OutputIt, class Size, class T >
OutputIt fill_n( OutputIt first, Size count, const T& value );
で定義 (1) (C++26 まで)
(C++20 から constexpr)
template< class OutputIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
constexpr OutputIt fill_n( OutputIt first, Size count,
                           const T& value );
(C++26 から)
template< class ExecutionPolicy,
          class ForwardIt, class Size, class T >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(2) (C++17 から)
(C++26 まで)
template< class ExecutionPolicy,
          class ForwardIt, class Size,
          class T = typename std::iterator_traits
                        <OutputIt>::value_type >
ForwardIt fill_n( ExecutionPolicy&& policy,
                  ForwardIt first, Size count, const T& value );
(C++26 から)
1) 指定された値valueを、範囲の先頭countから countfirst個の要素に代入します。ただしcount > 0 の場合に限ります。そうでない場合は何もしません。
2) (1)と同じですが、に従って実行されます。policyこのオーバーロードは、以下の式の値が
である場合にのみオーバーロード解決に参加します: true(C++20 まで)

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

(C++20 から)

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

以下の条件のいずれかが満たされる場合、プログラムは ill-formed です:

型が

引数

first - 変更する要素範囲の先頭
count - 変更する要素の数
value - 代入する値
policy - 使用する実行ポリシー
型要件
-
OutputIt は LegacyOutputIterator の要件を満たさなければなりません。
-
ForwardIt は LegacyForwardIterator の要件を満たさなければなりません。

戻り値

代入された最後の要素の次のイテレータ(count > 0 の場合)。それ以外の場合はfirst。

計算量

正確に std::max(0, count) 回の代入。

例外

テンプレートパラメータ ExecutionPolicy をもつオーバーロードは、以下のようにエラーを報告します:

  • アルゴリズムの一部として呼び出された関数が例外を送出し、ExecutionPolicy が標準ポリシーのいずれかである場合、std::terminate が呼び出されます。それ以外の ExecutionPolicy については、動作は実装定義です。
  • アルゴリズムがメモリの確保に失敗した場合、std::bad_alloc が送出されます。

実装例

fill_n
template<class OutputIt, class Size,
         class T = typename std::iterator_traits<OutputIt>::value_type>
OutputIt fill_n(OutputIt first, Size count, const T& value)
{
    for (Size i = 0; i < count; i++)
        *first++ = value;
    return first;
}

注記

機能テストマクロ 値 標準 機能
__cpp_lib_algorithm_default_value_type 202403 (C++26) アルゴリズムに対するリスト初期化(1,2)

例

#include <algorithm>
#include <complex>
#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> v1{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    // replace values of the first 5 elements with -1
    std::fill_n(v1.begin(), 5, -1);

    std::copy_n(v1.cbegin(), v1.size(), std::ostream_iterator<int>(std::cout, " "));
    std::cout << '\n';

    std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
    #ifdef __cpp_lib_algorithm_default_value_type
        std::fill_n(nums.begin(), 2, {4, 2});
    #else
        std::fill_n(nums.begin(), 2, std::complex<double>{4, 2});
    #endif
    std::copy_n(nums.cbegin(), nums.size(),
                std::ostream_iterator<std::complex<double>>(std::cout, " "));
    std::cout << '\n';
}

出力:

-1 -1 -1 -1 -1 5 6 7 8 9
(4,2) (4,2) (4,8)

欠陥報告

以下の動作を変更する欠陥報告は、以前に公開された C++ 標準に遡って適用されました。

DR 適用先 公開された動作 正しい動作
LWG 283 C++98 T は CopyAssignable である必要があったが、
Tが常に書き込み可能とは限らないためOutputIt
代わりに書き込み可能であることが要求される
LWG 426 C++98 計算量の要件は「正確に count
回の代入」であり、count が負の場合に破綻する
代入は行われない if
count が非正の場合
LWG 865 C++98 代入範囲に続く最初の要素の位置を返さなかった
代入範囲に続く最初の要素の位置を返さなかった
返すようになった

関連項目

範囲内の全ての要素に指定された値をコピー代入する
(関数テンプレート)&(アルゴリズム関数オブジェクト)
複数の要素に値を代入する
(アルゴリズム関数オブジェクト)