Hacker News new | ask | show | jobs
by raegis 1371 days ago
I think Jonathan Boccara's talk, "105 STL Algorithms in Less Than an Hour" ( https://www.youtube.com/watch?v=2olsGf6JIkU ), gives a nice overview of the <algorithm> library. Also, the examples on the reference pages (usually near the bottom) at cppreference.com are usually pretty good. For example: Here's how to create a pseudo random number generator using the Mersenne Twister engine.

  std::mt19937 e; // Mersenne Twister engine
  std::uniform_int_distribution<int> u(0,99999); // uniform ints 0 to 99999, inclusive
  auto rng = std::bind(u,e); // so rng() retuns the next random number
And filling a vector with random numbers could look like this:

  std::vector<int> nums(1000);
  std::generate(nums.begin(), nums.end(), rng);
This last line can be written in C++20 more simply like this:

  std::ranges::generate(nums,rng);
1 comments

Why should I do this, when I can just write:

    for (int i = 0; i < nums.size(); i++) {
        nums[i] = rng();
    }
Simple, easy to understand, actually compiles to efficient code even in Debug mode, don't need to include <algorithm> header which includes 10000+ lines of STL code which bloats compile times, etc.
Even better, so you can't accidentally move out of bounds:

  for (int i : nums) {
      nums[i] = rng();
  }
Edit: Ooops, I'm an idiot, this doesn't do anything useful (i is every value in nums, not the indices of nums...)
Doesn't that not work because `nums` is all initialized to 0 though?

Like, wouldn't it be

   for (int num : nums) {
      num = rng();
   }
(I don't know any c++). I kind of expect the above not to work though because it's doing an assignment. I suppose this is a good argument to just use a `fill` or `generate` function...
You're right, I completely forgot what it meant... The loop I wrote was basically equivalent to :

  for (int i = 0; i < nums.size(); ++i) {
    nums[nums[i]] = rng();
  }
Which happens not to go out of bounds simply because nums[i] is initially 0 for every i in the range - so it sets nums[0] to a different random number 1000 times.