std::iota
ja.cppreference.net より
| ヘッダ <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
以下の条件のいずれかが満たされる場合、プログラムは ill-formed です:
Tが value_type ofForwardItに変換可能でない。- 式
++valが ill-formed である。ここで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 には含まれなかったものの C++11 で標準ライブラリに追加された STL コンポーネント の 1 つです。
例
以下の例は、std::shuffle を std::list のイテレータの std::vector に適用します。 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++23) |
開始値の連続的な増分で範囲を埋める (アルゴリズム関数オブジェクト) |
| 指定された値を範囲内のすべての要素にコピー代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
範囲の要素に特定の値を代入する (アルゴリズム関数オブジェクト) |
| 連続する関数呼び出しの結果を範囲内のすべての要素に代入する (関数テンプレート & アルゴリズム関数オブジェクト) | |
(C++20) |
|
(C++20) |
関数の結果を範囲に保存する (アルゴリズム関数オブジェクト) |
(C++20) |
ビューは、初期値を繰り返しインクリメントして生成されるシーケンスからなる (クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
(C++26) |
ビューから0までnの増加する値のシーケンスを生成する(カスタマイゼーションポイントオブジェクト) |
| ビューは、適応されたシーケンスの各要素を、その要素の位置と値の両方を含むタプルにマッピングする (クラステンプレート) (レンジアダプタオブジェクト) |