Inicializando std :: vector com chamadas de função iterativa
Em muitos idiomas, existem geradores que ajudam a inicializar as coleções. Em C ++, se alguém quiser inicializar um vetor uniformemente, pode escrever:
std::vector<int> vec(10, 42); // get 10 elements, each equals 42
E se alguém quiser gerar valores diferentes na hora? Por exemplo, inicializá-lo com 10 valores aleatórios ou números consecutivos de 0 a 9? Esta sintaxe seria conveniente, masnão funciona em C ++ 11:
int cnt = 0;
std::vector<int> vec(10, [&cnt]()->int { return cnt++;});
Existe uma maneira agradável de inicializar uma coleção por chamadas de função iterativa? Eu atualmente uso esse padrão feio (não muito mais legível / curto do que um loop):
std::vector<int> vec;
int cnt = 0;
std::generate_n(std::back_inserter(vec), 10, [&cnt]()->int { return cnt++;});
Há uma coisa que ajudaria e explicaria a falta do primeiro construtor. Eu posso imaginar um iterador que leva uma função e número de chamadas, para que o construtor
vector ( InputIterator first, InputIterator last);
seria aplicável. Mas eu não encontrei nada assim na biblioteca padrão. Eu senti falta disso? Existe outra razão pela qual o primeiro construtor não chegou ao padrão?