std::ranges::uninitialized_fill_n
ja.cppreference.net より
| ヘッダ <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 として知られています) であり、以下の特徴があります。
- それらのいずれかを呼び出す際に、明示的なテンプレート実引数リストを指定することはできません。
- それらは 引数依存の名前探索 (ADL) では可視ではありません。
- それらのいずれかが 通常の非修飾名前探索 によって関数呼び出し演算子の左側の名前として見つけられた場合、引数依存の名前探索 (ADL) は抑制されます。
引数
| 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
関連項目
(C++20) |
オブジェクトを範囲で指定された未初期化メモリ領域にコピーする (アルゴリズム関数オブジェクト) |
| オブジェクトを開始点と個数で指定された未初期化メモリ領域にコピーする (関数テンプレート) |