Difference between revisions of "Functional C++"
| Line 24: | Line 24: | ||
== map == | == map == | ||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template<class InputIterator, class Function> | ||
| + | Function for_each(InputIterator first, InputIterator last, Function fn) | ||
| + | { | ||
| + | while (first!=last) { | ||
| + | fn (*first); | ||
| + | ++first; | ||
| + | } | ||
| + | return move(fn); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template <class InputIterator, class OutputIterator, class UnaryOperator> | ||
| + | OutputIterator transform (InputIterator first1, InputIterator last1, | ||
| + | OutputIterator result, UnaryOperator op) | ||
| + | { | ||
| + | while (first1 != last1) { | ||
| + | *result = op(*first1); // or: *result=binary_op(*first1,*first2++); | ||
| + | ++result; ++first1; | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
== foldl == | == foldl == | ||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template <class InputIterator, class T> | ||
| + | T accumulate (InputIterator first, InputIterator last, T init) | ||
| + | { | ||
| + | while (first!=last) { | ||
| + | init = init + *first; // or: init=binary_op(init,*first) for the binary_op version | ||
| + | ++first; | ||
| + | } | ||
| + | return init; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
== foldr == | == foldr == | ||
| + | |||
| + | user rbegin and rend | ||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template <class InputIterator, class T> | ||
| + | T accumulate (InputIterator first, InputIterator last, T init) | ||
| + | { | ||
| + | while (first!=last) { | ||
| + | init = init + *first; // or: init=binary_op(init,*first) for the binary_op version | ||
| + | ++first; | ||
| + | } | ||
| + | return init; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
== filter == | == filter == | ||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template <class InputIterator, class OutputIterator, class UnaryPredicate> | ||
| + | OutputIterator copy_if (InputIterator first, InputIterator last, | ||
| + | OutputIterator result, UnaryPredicate pred) | ||
| + | { | ||
| + | while (first!=last) { | ||
| + | if (pred(*first)) { | ||
| + | *result = *first; | ||
| + | ++result; | ||
| + | } | ||
| + | ++first; | ||
| + | } | ||
| + | return result; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
== replicate == | == replicate == | ||
| Line 42: | Line 110: | ||
} | } | ||
return first; | return first; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | |||
| + | <syntaxhighlight lang="cpp"> | ||
| + | template <class ForwardIterator, class T> | ||
| + | void fill (ForwardIterator first, ForwardIterator last, const T& val) | ||
| + | { | ||
| + | while (first != last) { | ||
| + | *first = val; | ||
| + | ++first; | ||
| + | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 09:58, 11 December 2014
| Function Equivalence | |
|---|---|
| Haskell | C++ |
| map | for_each |
| foldl | accumulate |
| foldr | accumulate |
| filter | copy_if |
| replicate | fill_n |
Contents
map
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn)
{
while (first!=last) {
fn (*first);
++first;
}
return move(fn);
}
template <class InputIterator, class OutputIterator, class UnaryOperator>
OutputIterator transform (InputIterator first1, InputIterator last1,
OutputIterator result, UnaryOperator op)
{
while (first1 != last1) {
*result = op(*first1); // or: *result=binary_op(*first1,*first2++);
++result; ++first1;
}
return result;
}
foldl
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init)
{
while (first!=last) {
init = init + *first; // or: init=binary_op(init,*first) for the binary_op version
++first;
}
return init;
}
foldr
user rbegin and rend
template <class InputIterator, class T>
T accumulate (InputIterator first, InputIterator last, T init)
{
while (first!=last) {
init = init + *first; // or: init=binary_op(init,*first) for the binary_op version
++first;
}
return init;
}
filter
template <class InputIterator, class OutputIterator, class UnaryPredicate>
OutputIterator copy_if (InputIterator first, InputIterator last,
OutputIterator result, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) {
*result = *first;
++result;
}
++first;
}
return result;
}
replicate
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
while (n>0) {
*first = val;
++first; --n;
}
return first;
}
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}