заполнить вектор случайными элементами - PullRequest
0 голосов
/ 08 января 2020

Почему моя лямбда не помещает элементы в вектор?

void generate_N_numbers_in_the_vector(std::vector<int> &vec, int &M,
                                      const int &N) {
  std::random_device rand;
  static std::mt19937 gen(rand());
  static std::uniform_int_distribution<int> distribution(0, M);
  vec.reserve(N);

  std::generate(vec.begin(), vec.end(), []() { return distribution(gen); });

  for (auto elem : vec) std::cout << elem << std::endl;
}

Ответы [ 2 ]

4 голосов
/ 08 января 2020

При использовании reserve количество элементов в векторе не увеличивается. Это означает, что разница между begin(vec) и end(vec) равна 0 (или каков бы ни был размер вашего вектора в начале). Есть две возможности:

vec.resize(N);
std::generate(vec.begin(), vec.end(), [](){return distribution(gen);});
// or
vec.reserve(N); // Not necessary but sensible.
std::generate_n(std::back_inserter(vec), N, [](){return distribution(gen);});
1 голос
/ 08 января 2020

std::vector::reserve только резервирует пробел, то есть увеличивает емкость, а не размер. Вместо этого используйте std::vector::resize, чтобы изменить размер вектора.

...