3 ms·
I think Jonathan Boccara's talk, "105 STL Algorithms in Less Than an Hour" ( https://www.youtube.com/watch?v=2olsGf6JIkU https://www.youtube.com/watch?v=2olsGf6
by raegis 4y ago
I think Jonathan Boccara's talk, "105 STL Algorithms in Less Than an Hour" ( https://www.youtube.com/watch?v=2olsGf6JIkU 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);
- cyber_kinetist 4y agoWhy 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.
- tsimionescu 4y agoEven 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...)
- leshow 4y agoDoesn'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...
- tsimionescu 4y agoYou'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.