std::iota
From cppreference.com
| ヘッダー <numeric> で定義 |
||
| template< class ForwardIt, class T > void iota( ForwardIt first, ForwardIt last, T value ); |
(C++11以降) (C++20 以降 constexpr) |
|
範囲 [first, last) を、value から始まり、++value を繰り返し評価することで、順次増加する値で埋めます。
等価な操作 (++value がインクリメントされた値を返すことを仮定)
*first = value; *++first = ++value; *++first = ++value; *++first = ++value; // repeats until “last” is reached
以下のいずれかの条件が満たされる場合、プログラムは不適格です。
-
TがForwardItの値型に変換できない。 - 式 ++val が不正な形式である。ここで val は型
Tの変数である。
目次 |
[編集] パラメータ
| first, last | - | value から始まる順次増加する値で埋める要素の範囲を定義するイテレータのペア |
| value | - | 格納する初期値 |
[編集] 計算量
正確に std::distance(first, last) 回のインクリメントと代入。
[編集] 可能な実装
template<class ForwardIt, class T> constexpr // since C++20 void iota(ForwardIt first, ForwardIt last, T value) { for (; first != last; ++first, ++value) *first = value; } |
[編集] 備考
この関数は、プログラミング言語 APL の整数関数 ⍳ にちなんで名付けられました。C++98 には含まれていなかったSTL コンポーネントの 1 つでしたが、C++11 で標準ライブラリに採用されました。
[編集] 例
次の例では、std::list のイテレータの vector に std::shuffle を適用します。コンテナの値を設定するために std::iota が使用されます。
このコードを実行
#include <algorithm> #include <iomanip> #include <iostream> #include <list> #include <numeric> #include <random> #include <vector> class BigData // inefficient to copy { int data[1024]; /* some raw data */ public: explicit BigData(int i = 0) { data[0] = i; /* ... */ } operator int() const { return data[0]; } BigData& operator=(int i) { data[0] = i; return *this; } /* ... */ }; int main() { std::list<BigData> l(10); std::iota(l.begin(), l.end(), -4); std::vector<std::list<BigData>::iterator> v(l.size()); std::iota(v.begin(), v.end(), l.begin()); // Vector of iterators (to original data) is used to avoid expensive copying, // and because std::shuffle (below) cannot be applied to a std::list directly. std::shuffle(v.begin(), v.end(), std::mt19937{std::random_device{}()}); std::cout << "Original contents of the list l:\t"; for (const auto& n : l) std::cout << std::setw(2) << n << ' '; std::cout << '\n'; std::cout << "Contents of l, viewed via shuffled v:\t"; for (const auto i : v) std::cout << std::setw(2) << *i << ' '; std::cout << '\n'; }
実行結果の例
Original contents of the list l: -4 -3 -2 -1 0 1 2 3 4 5 Contents of l, viewed via shuffled v: -1 5 -4 0 2 1 4 -2 3 -3
[編集] 関連項目
| (C++20) |
初期値を繰り返しインクリメントして生成されるシーケンスからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
| 範囲内のすべての要素に指定された値をコピー代入する (関数テンプレート) | |
| (C++20) |
要素の範囲に特定の値を代入する (アルゴリズム関数オブジェクト) |
| 範囲内のすべての要素に連続する関数呼び出しの結果を代入する (関数テンプレート) | |
| (C++20) |
関数の結果を範囲に保存する (アルゴリズム関数オブジェクト) |
| (C++23) |
開始値からの連続した増分値で範囲を埋める (アルゴリズム関数オブジェクト) |