std::fill
ja.cppreference.net から
| ヘッダ <algorithm>
|
||
template< class ForwardIt, class T >
void fill( ForwardIt first, ForwardIt last, const T& value );
|
で定義 (1) | (C++26まで) (C++20からconstexpr) |
template< class ForwardIt, class T = typename std::iterator_traits
<ForwardIt>::value_type >
constexpr void fill( ForwardIt first, ForwardIt last,
const T& value );
|
(C++26から) | |
template< class ExecutionPolicy, class ForwardIt, class T >
void fill( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, const T& value );
|
(2) | (C++17から) (C++26まで) |
template< class ExecutionPolicy,
class ForwardIt, class T = typename std::iterator_traits
<ForwardIt>::value_type >
void fill( ExecutionPolicy&& policy,
ForwardIt first, ForwardIt last, const T& value );
|
(C++26から) | |
1) 指定された
value を範囲 [first, last) 内のすべての要素に代入します。2) (1) と同じですが、 に従って実行されます。
policy このオーバーロードは、以下の式の値が である場合にのみオーバーロード解決に参加します:
true |
|
(C++20まで) |
|
|
(C++20から) |
value が 書き込み可能 でない場合、プログラムは ill-formed です。 first
引数
| first, last | - | 修正する要素の 範囲 を定義するイテレータのペア |
| value | - | 代入する値 |
| policy | - | 使用する 実行ポリシー |
| 型要件 | ||
-ForwardIt LegacyForwardIterator の要件を満たさなければなりません。 | ||
計算量
正確に std::distance(first, last) 回の代入。
例外
テンプレートパラメータ ExecutionPolicy を持つオーバーロードは、以下のようにエラーを報告します:
- アルゴリズムの一部として呼び出された関数が例外を投げ、
ExecutionPolicyが 標準ポリシー のいずれかである場合、 std::terminate が呼び出されます。それ以外のExecutionPolicyについては、動作は処理系定義です。 - アルゴリズムがメモリの確保に失敗した場合、 std::bad_alloc が投げられます。
実装例
| fill (1) |
|---|
template<class ForwardIt,
class T = typename std::iterator_traits<ForwardIt>::value_type>
void fill(ForwardIt first, ForwardIt last, const T& value)
{
for (; first != last; ++first)
*first = value;
}
|
注記
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_algorithm_default_value_type |
202403 |
(C++26) | アルゴリズムのためのリスト初期化 (1,2) |
例
このコードを実行する
#include <algorithm>
#include <complex>
#include <iostream>
#include <vector>
void println(const auto& seq)
{
for (const auto& e : seq)
std::cout << e << ' ';
std::cout << '\n';
}
int main()
{
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8};
println(v);
// set all of the elements to 8
std::fill(v.begin(), v.end(), 8);
println(v);
std::vector<std::complex<double>> nums{{1, 3}, {2, 2}, {4, 8}};
println(nums);
#ifdef __cpp_lib_algorithm_default_value_type
std::fill(nums.begin(), nums.end(), {4, 2});
#else
std::fill(nums.begin(), nums.end(), std::complex<double>{4, 2});
#endif
println(nums);
}
出力:
0 1 2 3 4 5 6 7 8
8 8 8 8 8 8 8 8 8
(1,3) (2,2) (4,8)
(4,2) (4,2) (4,2)
欠陥報告
以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡って適用されました。
| DR | 適用先 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 283 | C++98 | T は CopyAssignable である必要がありましたが、T は常に ForwardIt
|
に書き込み可能であるとは限りませんでした。代わりに書き込み可能である必要があります。 |
関連項目
| 範囲内のN個の要素に指定された値をコピー代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++11) |
要素の範囲を新しい位置にコピーする (関数テンプレート & アルゴリズム関数オブジェクト) |
(C++20)(C++20) |
|
| 連続する関数呼び出しの結果を範囲内のすべての要素に代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
| 関数を要素の範囲に適用し、結果を宛先範囲に格納する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
範囲の要素に特定の値を代入する (アルゴリズム関数オブジェクト) |