На многих языках существуют генераторы, которые помогают инициализировать коллекции. В С++, если вы хотите равномерно инициализировать вектор, можно написать:
std::vector<int> vec(10, 42); // get 10 elements, each equals 42
Что делать, если вы хотите генерировать разные значения на лету? Например, инициализируйте его 10 случайными значениями или последовательными номерами от 0 до 9? Этот синтаксис был бы удобен, но он не работает в С++ 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);
. Но я не нашел ничего подобного в стандартной библиотеке. Я пропустил это? Есть ли другая причина, почему первый конструктор не дошел до стандарта?