Namespaces
Variants

std::uninitialized_fill

ja.cppreference.net から
 
 
アルゴリズムライブラリ
制約付きアルゴリズムとレンジに関するアルゴリズム (C++20)
制約付きアルゴリズム、例: ranges::copy, ranges::sort, ...
変更操作を行わないシーケンス操作    
一括操作
(C++17)
検索操作
変更操作を行うシーケンス操作
コピー操作
(C++11)
(C++11)
swap操作
変換操作
生成操作
削除操作
順序変更操作
(C++17まで)(C++11)
(C++20)(C++20)
サンプリング操作
(C++17)

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

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


 
 
ヘッダ <memory>
template< class NoThrowForwardIt, class T >
void uninitialized_fill( NoThrowForwardIt first,
                         NoThrowForwardIt last, const T& value );
で定義 (1) (C++26 から constexpr)
template< class ExecutionPolicy, class NoThrowForwardIt, class T >
void uninitialized_fill( ExecutionPolicy&& policy,
                         NoThrowForwardIt first,
                         NoThrowForwardIt last, const T& value );
(2) (C++17 から)
1) コピー先レンジ [first, last) 内の要素を、指定された値 value で、あたかも以下のように構築します:

for (; first != last; ++first)
    ::new (voidify(*first))
        typename std::iterator_traits<NoThrowForwardIt>::value_type(value);

初期化中に例外が送出された場合、すでに構築されたオブジェクトは未規定の順序で破棄されます。
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, last - 初期化する要素の 範囲 を定義するイテレータのペア
value - 要素を構築するための値
policy - 使用する 実行ポリシー
型要件
-
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 T>
constexpr void uninitialized_fill(NoThrowForwardIt first, NoThrowForwardIt last,
                                  const T& value)
{
    using V = typename std::iterator_traits<NoThrowForwardIt>::value_type;
    NoThrowForwardIt current = first;
    try
    {
        for (; current != last; ++current)
            ::new (static_cast<void*>(std::addressof(*current))) V(value);
    } 
    catch (...)
    {
        for (; first != current; ++first)
            first->~V();
        throw;
    }
}

例

#include <algorithm>
#include <iostream>
#include <memory>
#include <string>
int main()
{
    const std::size_t sz = 4;
    std::allocator<std::string> alloc;
    std::string* p = alloc.allocate(sz);
    std::uninitialized_fill(p, p + sz, "Example");
    for (std::string* i = p; i != p + sz; ++i)
    {
        std::cout << *i << '\n';
        i->~basic_string<char>();
    }
    alloc.deallocate(p, sz);
}

出力:

Example
Example
Example
Example

欠陥報告

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

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

関連項目

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