Namespaces
Variants

std::uninitialized_fill_n

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

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


 
 
ヘッダ <memory>
template< class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( NoThrowForwardIt first,
                                       Size count, const T& value );
で定義 (1) (C++26 から constexpr)
template< class ExecutionPolicy,
          class NoThrowForwardIt, class Size, class T >
NoThrowForwardIt uninitialized_fill_n( ExecutionPolicy&& policy,
                                       NoThrowForwardIt first,
                                       Size count, const T& value );
(2) (C++17 から)
1) 最初の count 個の要素を、first で始まる移動先レンジに、与えられた値 value で、以下のように構築する:

for (; count--; ++first)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(value);
return first;

初期化中に例外が発生した場合、既に構築されたオブジェクトは未規定の順序で破棄される。
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 - 構築する要素の数
value - 要素を構築するための値
型要件
-
NoThrowForwardIt は LegacyForwardIterator の要件を満たさなければならない。
-
NoThrowForwardIt の有効なインスタンスを通じたインクリメント、代入、比較、間接参照は例外を投げてはならない。 NoThrowForwardIt 値に & * を適用すると、その値型へのポインタが得られなければならない。 (C++11まで)

戻り値

上記の通り。

例外

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

注釈

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

実装例

template<class NoThrowForwardIt, class Size, class T>
constexpr NoThrowForwardIt uninitialized_fill_n(NoThrowForwardIt first,
                                                Size count, const T& value)
{
    using V = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; count > 0; ++current, (void) --count)
            ::new (static_cast<void*>(std::addressof(*current))) V(value);
        return current;
    }
    catch (...)
    {
        for (; first != current; ++first)
            first->~V();
        throw;
    }
    return current;
}

例

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
#include <tuple>
int main()
{
    std::string* p;
    std::size_t sz;
    std::tie(p, sz) = std::get_temporary_buffer<std::string>(4);
    std::uninitialized_fill_n(p, sz, "Example");
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    std::return_temporary_buffer(p);
}

出力:

Example
Example
Example
Example

欠陥報告

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

DR 適用先 公開時の動作 正しい動作
LWG 866 C++98 T を NoThrowForwardIt の値型として与えた場合、
T::operator new が存在すると、プログラムは ill-formed になる可能性がある
代わりにグローバル配置 new を使用する
LWG 1339 C++98 塗りつぶし範囲
に続く最初の要素の位置が返されなかった
返される
LWG 2433 C++11 このアルゴリズムはオーバーロードされた operator& によって乗っ取られる可能性があるstd::addressof
を使用する

関連項目

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