Инициализация std :: vector с помощью итеративных вызовов функций

Во многих языках существуют генераторы, которые помогают инициализировать коллекции. В C ++, если кто-то хочет инициализировать вектор равномерно, можно написать:

std::vector vec(10, 42); // get 10 elements, each equals 42

Что если кто-то хочет генерировать разные значения на лету? Например, инициализировать его 10 случайными значениями или последовательными числами от 0 до 9? Этот синтаксис был бы удобен, но этоне работает в C ++ 11:

int cnt = 0;
std::vector vec(10, [&cnt]()->int { return cnt++;});

Есть ли хороший способ инициализировать коллекцию с помощью итеративных вызовов функций? В настоящее время я использую этот уродливый шаблон (не намного более читаемый / короткий, чем цикл):

std::vector vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});

Есть кое-что, что могло бы помочь, и это объяснило бы отсутствие первого конструктора. Я могу представить себе итератор, который принимает функцию и количество вызовов, так что конструктор

vector ( InputIterator first, InputIterator last);

будет применимо. Но я не нашел ничего подобного в стандартной библиотеке. Я пропустил это? Есть ли еще одна причина, по которой первый конструктор не добрался до стандарта?

Ответы на вопрос(5)

Ваш ответ на вопрос