Inicjowanie std :: vector z iteracyjnymi wywołaniami funkcji

W wielu językach istnieją generatory, które pomagają inicjować kolekcje. W C ++, jeśli chce się zainicjować wektor jednolicie, można napisać:

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

Co jeśli ktoś chce generować różne wartości w locie? Na przykład zainicjuj go za pomocą 10 losowych wartości lub kolejnych liczb od 0 do 9? Ta składnia byłaby wygodna, ale tonie działa w C ++ 11:

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

Czy istnieje dobry sposób na zainicjowanie kolekcji przez iteracyjne wywołania funkcji? Obecnie używam tego brzydkiego wzoru (mało czytelnego / krótszego niż pętla):

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

Jest coś, co pomogłoby, a to wyjaśniałoby brak pierwszego konstruktora. Mogę sobie wyobrazić iterator, który przyjmuje funkcję i liczbę wywołań, tak że konstruktor

vector ( InputIterator first, InputIterator last);

miałoby zastosowanie. Ale nie znalazłem czegoś takiego w standardowej bibliotece. Czy tęskniłem za tym? Czy jest inny powód, dla którego pierwszy konstruktor nie dotarł do standardu?

questionAnswers(5)

yourAnswerToTheQuestion