-
Notifications
You must be signed in to change notification settings - Fork 37
/
numeric.hpp
160 lines (126 loc) · 3.59 KB
/
numeric.hpp
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#ifndef _NUMERIC_H_
#define _NUMERIC_H_
#include "iterator.hpp"
namespace mystl {
template <typename ForwardIterator, typename T>
inline void iota( ForwardIterator first, ForwardIterator last, T value )
{
for( ; first != last; ++first )
{
*first = value;
++value;
}
}
template <typename InputIterator, typename T>
inline T accumulate( InputIterator first, InputIterator last, T initValue )
{
for( ; first != last; ++first )
{
initValue = initValue + *first;
}
return initValue;
}
template <typename InputIterator, typename T, typename BinaryFunction>
inline T accumulate( InputIterator first, InputIterator last, T initValue, BinaryFunction binaryFunc )
{
for( ; first != last; ++first )
{
initValue = binaryFunc( initValue, *first );
}
return initValue;
}
template <typename InputIteratorL, typename InputIteratorR, typename T>
inline T inner_product( InputIteratorL firstL, InputIteratorL lastL, InputIteratorR firstR, T initValue )
{
for( ; firstL != lastL; ++firstL, ++firstR )
{
initValue = initValue + ( *firstL ) * ( *firstR );
}
return initValue;
}
template <typename InputIteratorL, typename InputIteratorR, typename T, typename BinaryFunctionL, typename BinaryFunctionR>
inline T inner_product( InputIteratorL firstL, InputIteratorL lastL, InputIteratorR firstR, T initValue,
BinaryFunctionL binaryFuncL, BinaryFunctionR binaryFuncR )
{
for( ; firstL != lastL; ++firstL, ++firstR )
{
initValue = binaryFuncL( initValue, binaryFuncR( *firstL, *firstR ) );
}
return initValue;
}
template <typename InputIterator, typename OutputIterator>
OutputIterator partial_sum( InputIterator first, InputIterator last, OutputIterator dest )
{
if( first == last )
{
return dest;
}
auto total = *first;
*dest++ = total;
while( ++first != last )
{
total = total + *first;
*dest++ = total;
}
return dest;
}
template <typename InputIterator, typename OutputIterator, typename BinaryFunction>
OutputIterator partial_sum( InputIterator first, InputIterator last, OutputIterator dest, BinaryFunction binaryFunc )
{
if( first == last )
{
return dest;
}
auto total = *first;
*dest++ = total;
while( ++first != last )
{
total = binaryFunc( total, *first );
*dest++ = total;
}
return dest;
}
template <typename InputIterator, typename OutputIterator>
OutputIterator adjacent_difference( InputIterator first, InputIterator last, OutputIterator dest )
{
if( first == last )
{
return dest;
}
auto prev = *first;
*dest++ = prev;
while( ++first != last )
{
auto curr = *first;
*dest++ = curr - prev;
prev = std::move( curr );
}
/**
Note: because the iterator is input iterator, we can't write the code as following:
while( ++first != last )
{
*dest++ = *first - prev;
prev = *first;
}
**/
return dest;
}
template <typename InputIterator, typename OutputIterator, typename BinaryFunction>
OutputIterator adjacent_difference( InputIterator first, InputIterator last, OutputIterator dest, BinaryFunction binaryFunc )
{
if( first == last )
{
return dest;
}
auto prev = *first;
*dest++ = prev;
while( ++first != last )
{
auto curr = *first;
*dest++ = binaryFunc( curr, prev );
prev = std::move( curr );
}
return dest;
}
}; // namespace mystl
#endif /* _NUMERIC_H_ */