Namespaces
Variants

std::ranges::uninitialized_fill_n

ja.cppreference.net より
 
 
アルゴリズムライブラリ
制約付きアルゴリズムと範囲に関するアルゴリズム (C++20)
制約付きアルゴリズム、例えば ranges::copy, ranges::sort, ...
変更操作を行わないシーケンス操作    
一括操作
(C++17)
検索操作
変更操作を行うシーケンス操作
コピー操作
(C++11)
(C++11)
スワップ操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
標本抽出操作
(C++17)

ソートと関連操作
分割操作
(C++11)    

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


 
 
ヘッダ <memory>
で定義
template< /*nothrow-forward-iterator*/ I, class T >
    requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill_n( I first, std::iter_difference_t<I> count,
                        const T& value );
(1) (C++20以上)
(constexpr C++26以上)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I,
          class T = std::iter_value_t<I> >
    requires std::constructible_from<std::iter_value_t<I>, const T&>
I uninitialized_fill_n( Ep&& exec, I first, std::iter_difference_t<I> count,
                        const T& value );
(2) (C++26以上)

`/*execution-policy*/` の定義については、このページを参照してください。その他の説明専用コンセプトの定義については、このページを参照してください。

1) 指定された値 first + [0, count) で、コピー先範囲 value に要素を構築します。あたかも次のように行われるかのように振る舞います。

return ranges::uninitialized_fill(std::counted_iterator(first, count),
                                  std::default_sentinel, value).base();

初期化中に例外が送出された場合、すでに構築されたオブジェクトは未規定の順序で破棄されます。
2) (1) と同じですが、 に従ってpolicy実行されます。

このページに記述されている関数のようなエンティティは、アルゴリズム関数オブジェクト (非公式に niebloid として知られています) であり、以下の特徴があります。

引数

first 初期化する要素の範囲の先頭
count 構築する要素の数
value 要素を構築するための値
policy 使用する実行ポリシー

戻り値

上記の通り。

例外

コピー先の範囲にある要素の構築中に例外が発生した場合。

2) 実行処理中:
  • 並列化に必要な一時メモリリソースが利用できない場合、std::bad_allocが送出される。
  • アルゴリズムの引数を介してオブジェクトにアクセスしているときに捕捉されない例外が発生した場合、その動作は実行ポリシーによって決まる(標準ポリシーの場合は、std::terminateが呼び出される)。

注記

実装は(例えばranges::uninitialized_fill_n rangeの値型がranges::fill_nを使用することにより)出力範囲の値型がTrivialTypeである場合に

機能テストマクロ 値 標準 機能
__cpp_lib_parallel_algorithm 202506L (C++26) 並列範囲アルゴリズム
__cpp_lib_raw_memory_algorithms 202411L (C++26) constexpr 特化アルゴリズム用<memory>特殊化されたアルゴリズム、(1)

実装例

struct uninitialized_fill_n_fn
{
    template</*nothrow-forward-range*/ I, class T>
        requires std::constructible_from<std::iter_value_t<I>, const T&>
    constexpr I operator()(I first, std::iter_difference_t<I> count,
                           const T& value) const
    {
        I rollback{first};
        try
        {
            for (; count-- > 0; ++first)
                ranges::construct_at(std::addressof(*first), value);
            return first;
        }
        catch (...) // rollback: destroy constructed elements
        {
            for (; rollback != first; ++rollback)
                ranges::destroy_at(std::addressof(*rollback));
            throw;
        }
    }
};

inline constexpr uninitialized_fill_n_fn uninitialized_fill_n{};

例

#include <iostream>
#include <memory>
#include <string>
int main()
{
    constexpr int n{3};
    alignas(alignof(std::string)) char out[n * sizeof(std::string)];
    try
    {
        auto first{reinterpret_cast<std::string*>(out)};
        auto last = std::ranges::uninitialized_fill_n(first, n, "cppreference");
        for (auto it{first}; it != last; ++it)
            std::cout << *it << '\n';
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
}

出力:

cppreference
cppreference
cppreference

関連項目

オブジェクトを範囲で指定された未初期化メモリ領域にコピーする
(アルゴリズム関数オブジェクト)
オブジェクトを開始点と個数で指定された未初期化メモリ領域にコピーする
(関数テンプレート)