std::ranges::generate_n
ja.cppreference.net より
| ヘッダ <algorithm>
|
||
| 呼び出しシグネチャ |
||
template< std::input_or_output_iterator O, std::copy_constructible F >
requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>>
constexpr O
generate_n( O first, std::iter_difference_t<O> n, F gen );
|
(C++20以降) | |
以下の結果を代入する: 連続的な の呼び出しの結果を、関数オブジェクト gen の各要素に代入する。範囲 [first, first + n)、もし 0 < n。そうでなければ何もしない。
このページで説明される関数類似エンティティは アルゴリズム関数オブジェクト (非公式には niebloids)、すなわち:
- 明示的なテンプレート引数リストは、それらのいずれかを呼び出すときに指定できません。
- それらは ADL (argument-dependent lookup) からは見えません。
- それらのいずれかが 通常の非修飾名前検索 によって関数呼び出し演算子の左側の名前として見つかった場合、ADL は抑制されます。
パラメータ
| first | - | 変更する要素範囲の先頭 |
| n | - | 変更する要素の数 |
| gen | - | ジェネレータ関数オブジェクト |
戻り値
countが 0 < count の場合、割り当てられた最後の要素の次の位置を指すイテレータ、 first それ以外の場合。
計算量
正確に n 回の gen ( ) の呼び出しと代入が行われます。
実装例
struct generate_n_fn { template<std::input_or_output_iterator O, std::copy_constructible F> requires std::invocable<F&> && std::indirectly_writable<O, std::invoke_result_t<F&>> constexpr O operator()(O first, std::iter_difference_t<O> n, F gen) const { for (; n-- > 0; *first = std::invoke(gen), ++first) {} return first; } }; inline constexpr generate_n_fn generate_n {}; |
例
このコードを実行
#include <algorithm> #include <array> #include <iostream> #include <random> #include <string_view> auto dice() { static std::uniform_int_distribution<int> distr {1, 6}; static std::random_device engine; static std::mt19937 noise {engine()}; return distr(noise); } void print(const auto& v, std::string_view comment) { for (int i : v) std::cout << i << ' '; std::cout << '(' << comment << ")\n"; } int main() { std::array<int, 8> v; std::ranges::generate_n(v.begin(), v.size(), dice); print(v, "dice"); std::ranges::generate_n(v.begin(), v.size(), [n {0}] mutable { return n++; }); // same effect as std::iota(v.begin(), v.end(), 0); print(v, "iota"); }
出力例:
5 5 2 2 6 6 3 5 (dice) 0 1 2 3 4 5 6 7 (iota)
関連項目
|
(C++20)
|
関数の結果を範囲に保存する
(アルゴリズム関数オブジェクト) |
|
(C++26)
|
一様乱数ビット生成器からの乱数で範囲を埋める
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
範囲の要素に特定の値を代入する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
指定された数の要素に値を代入する
(アルゴリズム関数オブジェクト) |
|
(C++20)
|
範囲の要素に関数を適用する
(アルゴリズム関数オブジェクト) |
|
連続する関数呼び出しの結果を範囲内のN個の要素に代入する
(関数テンプレート) |