-
Notifications
You must be signed in to change notification settings - Fork 160
/
Copy pathdesign_patterns.cpp
99 lines (75 loc) · 2.56 KB
/
design_patterns.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "common.hpp"
// VisibleInnerIterable
/*
this is the best way I could find to make a member
iterable object such as a container available outside
design goal:
- to change container type, you only change a single typedef
difficulty:
- there is no `Iterator` interface that iterates over anything in the stdlib
for performance reasons.
By iterable understand something that has an `::iterator`,
a `begin()` and an `end()` methods, like stl containers
*/
class VisibleInnerIterable {
public:
VisibleInnerIterable();
typedef std::vector<int> Iterable;
const Iterable& getIterable();
private:
Iterable iterable;
};
VisibleInnerIterable::VisibleInnerIterable() : iterable{0,1,2} {}
const VisibleInnerIterable::Iterable& VisibleInnerIterable::getIterable() {
return iterable;
}
int main() {
// VisibleInnerIterable
{
VisibleInnerIterable c;
VisibleInnerIterable::Iterable ita = c.getIterable();
VisibleInnerIterable::Iterable::iterator it = ita.begin();
int i;
int is[]{0,1,2};
for (
it = ita.begin(), i=0;
it != ita.end();
++it, ++i
)
{
assert(*it == is[i]);
}
}
/*
# Dynamic multi-dimensional array
Sources: <http://www.cplusplus.com/forum/articles/7459/>
In addition to C malloc like techniques, C++ also offers the simpler possibility of using std::vectors
which will automatically manage the memory allocation / dellocation for us.
The tradeoff is that this method will be potentially slower since it:
- requires constructor calls at non uniform initialization.
- may require function calls for the `[]` operator overload.
It is however likely that the compiler will inline those.
*/
{
// Given width and height.
{
int width = 2, height = 3;
std::vector<std::vector<int>> array_2d(height, std::vector<int>(width));
array_2d[0][0] = 1;
array_2d[2][1] = 5;
assert(array_2d[0][0] == 1);
assert(array_2d[0][1] == 0);
assert(array_2d[2][1] == 5);
}
// Uniform initialized.
{
std::vector<std::vector<int>> array_2d{
{0, 1},
{2, 3},
{4, 5},
};
assert(array_2d[0][0] == 0);
assert(array_2d[2][1] == 5);
}
}
}