Namespaces
Variants

std::ranges::uninitialized_value_construct_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 >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_value_construct_n( I first,
                                   std::iter_difference_t<I> count );
呼び出しシグネチャ (1)
(C++20以上)
template< /*execution-policy*/ Ep, /*nothrow-random-access-iterator*/ I >
    requires std::default_initializable<std::iter_value_t<I>>
I uninitialized_value_construct_n( Ep&& policy, I first,
                                   std::iter_difference_t<I> count );
(C++26以上 constexpr) (2)

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

1) 対象範囲 first + [0, count) 内の要素を、あたかも次のようにして値初期化により構築します:

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

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

このページで説明される関数ライクなエンティティは アルゴリズム関数オブジェクト (非公式に niebloids として知られる) です。すなわち:

パラメータ

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

戻り値

上記の通り。

例外

宛先範囲の要素の構築中に投げられた例外はすべて。

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

注釈

実装は、ranges::uninitialized_value_construct_nの効率を向上させる可能性があります(例えばranges::fill_nを用いて)、範囲の値型がCopyAssignable TrivialTypeである場合。

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

実装例

struct uninitialized_value_construct_n_fn
{
    template</*nothrow-forward-iterator*/ I>
        requires std::default_initializable<std::iter_value_t<I>>
    constexpr I operator()(I first, std::iter_difference_t<I> count) const
    {
        auto iter = std::counted_iterator(first, count);
        return ranges::uninitialized_value_construct(iter, std::default_sentinel).base();
    }
};

inline constexpr uninitialized_value_construct_n_fn uninitialized_value_construct_n{};

例

#include <iostream>
#include <memory>
#include <string>
int main()
{
    struct S { std::string m{"█▓▒░ █▓▒░ █▓▒░ "}; };
    constexpr int n{4};
    alignas(alignof(S)) char out[n * sizeof(S)];
    try
    {
        auto first{reinterpret_cast<S*>(out)};
        auto last = std::ranges::uninitialized_value_construct_n(first, n);
        auto count{1};
        for (auto it{first}; it != last; ++it)
            std::cout << count++ << ' ' << it->m << '\n';
        std::ranges::destroy(first, last);
    }
    catch (...)
    {
        std::cout << "Exception!\n";
    }
    // スカラ型の場合、uninitialized_value_construct_nは
    // 指定された未初期化メモリ領域をゼロ初期化します。
    int v[]{1, 2, 3, 4, 5, 6, 7, 8};
    std::cout << ' ';
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << "\n ";
    std::ranges::uninitialized_value_construct_n(std::begin(v), std::size(v));
    for (const int i : v)
        std::cout << i << ' ';
    std::cout << '\n';
}

出力:

1 █▓▒░ █▓▒░ █▓▒░ 
2 █▓▒░ █▓▒░ █▓▒░ 
3 █▓▒░ █▓▒░ █▓▒░ 
4 █▓▒░ █▓▒░ █▓▒░
1 2 3 4 5 6 7 8
0 0 0 0 0 0 0 0

関連項目

範囲で指定された初期化されていないメモリ領域に、値初期化でオブジェクトを構築します
(アルゴリズム関数オブジェクト)
範囲で指定された初期化されていないメモリ領域に、デフォルト初期化でオブジェクトを構築します
(アルゴリズム関数オブジェクト)
開始位置と個数で指定された初期化されていないメモリ領域に、デフォルト初期化でオブジェクトを構築します
(アルゴリズム関数オブジェクト)
開始位置と個数で指定された初期化されていないメモリ領域に、値初期化でオブジェクトを構築します
(関数テンプレート)