Инициализация std :: vector с помощью итеративных вызовов функций
Во многих языках существуют генераторы, которые помогают инициализировать коллекции. В C ++, если кто-то хочет инициализировать вектор равномерно, можно написать:
std::vector<int> vec(10, 42); // get 10 elements, each equals 42
Что если кто-то хочет генерировать разные значения на лету? Например, инициализировать его 10 случайными значениями или последовательными числами от 0 до 9? Этот синтаксис был бы удобен, но этоdoes not work в C ++ 11:
int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});
Есть ли хороший способ инициализировать коллекцию с помощью итеративных вызовов функций? В настоящее время я использую этот уродливый шаблон (не намного более читаемый / короткий, чем цикл):
std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});
Есть кое-что, что могло бы помочь, и это объяснило бы отсутствие первого конструктора. Я могу представить себе итератор, который принимает функцию и количество вызовов, так что конструктор
vector ( InputIterator first, InputIterator last);
будет применимо. Но я не нашел ничего подобного в стандартной библиотеке. Я пропустил это? Есть ли еще одна причина, по которой первый конструктор не добрался до стандарта?