名前空間
変種
操作

std::ranges::uninitialized_fill_n

From cppreference.com
< cpp‎ | memory
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
ranges::uninitialized_fill_n
(C++20)
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
ヘッダ <memory> で定義
呼び出しシグネチャ
template< no-throw-forward-range 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 );
(C++20以降)
(C++26 以降 constexpr)

value を、未初期化メモリ領域 first + [0count) に、まるで return ranges::uninitialized_fill(std::counted_iterator(first, count),
                                  std::default_sentinel, value).base();
であるかのようにコピーする。

初期化中に例外がスローされた場合、すでに構築されたオブジェクトは未指定の順序で破棄される。

このページで説明されている関数のようなエンティティは、アルゴリズム関数オブジェクト(非公式にはニーブロイドとして知られている)です。つまり、

目次

[編集] パラメーター

first - 初期化する要素の範囲の先頭
count - 構築する要素の数
value - 要素を構築する値

[編集] 戻り値

上記の通り。

[編集] 計算量

count に対して線形。

[編集] 例外

変換先範囲の要素の構築時にスローされる例外。

[編集] 備考

出力範囲の要素型が TrivialType の場合、実装は ranges::fill_n を使用するなどして ranges::uninitialized_fill_n の効率を向上させることができる。

機能テストマクロ 規格 機能
__cpp_lib_raw_memory_algorithms 202411L (C++26) 特殊なメモリアルゴリズムconstexpr

[編集] 可能な実装

struct uninitialized_fill_n_fn
{
    template<no-throw-forward-range I, class T>
    requires std::constructible_from<std::iter_value_t<I>, const T&>
    I operator()(I first, std::iter_difference_t<I> n, const T& x) const
    {
        I rollback{first};
        try
        {
            for (; n-- > 0; ++first)
                ranges::construct_at(std::addressof(*first), x);
            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

[編集] 欠陥報告

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

DR 適用対象 公開された動作 正しい動作
LWG 3870 C++20 このアルゴリズムは、const ストレージ上にオブジェクトを作成する可能性があります。 禁止されたままです。

[編集] 関連項目

範囲で定義された未初期化メモリ領域にオブジェクトをコピーします
(アルゴリズム関数オブジェクト)[編集]
開始位置と個数で定義された未初期化メモリ領域にオブジェクトをコピーします
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)