Skip to content

Commit 82f23c3

Browse files
Merge pull request hsf-training#222 from bernhardmgruber/ref
Improve STL exercise
2 parents 936f344 + e2a7e6c commit 82f23c3

File tree

2 files changed

+28
-21
lines changed

2 files changed

+28
-21
lines changed

code/stl/randomize.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,23 @@
55
#include <random>
66
#include "Complex.hpp"
77

8-
using namespace std;
9-
108
template<typename T>
119
void compute(int len, T initial, T step) {
1210
// allocate vectors
1311
std::vector<T> v(len+1), diffs(len+1);
1412

1513
// fill and randomize v
16-
generate(, , [](...) { ...; });
17-
shuffle(..., std::default_random_engine{});
14+
std::generate(, , [](...) { ...; });
15+
std::shuffle(..., std::default_random_engine{});
1816

1917
// compute differences
20-
adjacent_difference(...);
18+
std::adjacent_difference(...);
2119

22-
// compute standard deviation of it
23-
T sum = reduce(...);
24-
T sumsq = reduce(..., [](...) { ...; });
25-
T mean = sum/len;
26-
T variance = sumsq/len - mean*mean;
20+
// compute standard deviation of all differences
21+
const T sum = std::reduce(...);
22+
const T sumsq = std::reduce(..., [](...) { ...; });
23+
const T mean = sum/len;
24+
const T variance = sumsq/len - mean*mean;
2725

2826
std::cout << "Range = [" << initial << ", " << step*len << "]\n"
2927
<< "Mean = " << mean << '\n'

code/stl/solution/randomize.sol.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
#include <random>
66
#include "Complex.hpp"
77

8-
using namespace std;
9-
108
template<typename T>
119
struct Generator {
1210
T m_value, m_step;
@@ -29,17 +27,28 @@ void compute(int len, T initial, T step) {
2927
std::vector<T> v(len+1), diffs(len+1);
3028

3129
// fill and randomize v
32-
generate(v.begin(), v.end(), Generator<T>(initial, step));
33-
shuffle(v.begin(), v.end(), std::default_random_engine{});
30+
std::generate(v.begin(), v.end(), Generator<T>(initial, step));
31+
// Alternatively:
32+
// std::generate(v.begin(), v.end(), [value = initial, step]() mutable {
33+
// const T cur = value;
34+
// value += step;
35+
// return cur;
36+
// });
3437

35-
// compute differences
36-
adjacent_difference(v.begin(), v.end(), diffs.begin());
38+
std::shuffle(v.begin(), v.end(), std::default_random_engine{});
3739

38-
// compute standard deviation of it
39-
T sum = reduce(diffs.begin()+1, diffs.end(), T());
40-
T sumsq = reduce(diffs.begin()+1, diffs.end(), T(), sumsquare<T>());
41-
T mean = sum/len;
42-
T variance = sumsq/len - mean*mean;
40+
// compute differences
41+
std::adjacent_difference(v.begin(), v.end(), diffs.begin());
42+
43+
// compute standard deviation of all differences.
44+
// Note that the first element is just the original element itself, so we need to skip it.
45+
const T sum = std::reduce(diffs.begin()+1, diffs.end(), T());
46+
const T sumsq = std::reduce(diffs.begin()+1, diffs.end(), T(), sumsquare<T>());
47+
// Alternatively:
48+
// const T sumsq = std::reduce(diffs.begin()+1, diffs.end(), T(),
49+
// [](const T& s, const T& a) { return s + a * a; });
50+
const T mean = sum/len;
51+
const T variance = sumsq/len - mean*mean;
4352

4453
std::cout << "Range = [" << initial << ", " << step*len << "]\n"
4554
<< "Mean = " << mean << '\n'

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy