-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathiterator.transform.cpp
More file actions
94 lines (72 loc) · 2.44 KB
/
iterator.transform.cpp
File metadata and controls
94 lines (72 loc) · 2.44 KB
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
#include <functional>
#include <algorithm>
#include <iostream>
#include <boost/iterator/transform_iterator.hpp>
//#include <boost/phoenix/core.hpp>
//#include <boost/phoenix/bind.hpp>
//#include <boost/phoenix/operator.hpp>
// What a bummer. We can't use std::binder1st with transform iterator
// because it does not have a default constructor. Here's a version
// that does.
//
namespace boost {
template <class Operation>
class binder1st
: public std::unary_function <
typename Operation::second_argument_type,
typename Operation::result_type
>
{
protected:
Operation op;
typename Operation::first_argument_type value;
public:
binder1st() {} // this had to be added!
binder1st(const Operation& x, const typename Operation::first_argument_type& y)
: op(x), value(y) {}
typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const
{
return op(value, x);
}
};
template <class Operation, class T>
inline binder1st<Operation> bind1st(const Operation& op, const T& x)
{
typedef typename Operation::first_argument_type arg1_type;
return binder1st<Operation>(op, arg1_type(x));
}
} // namespace boost
using namespace std;
using namespace boost;
int main(int argc, char* argv[])
{
// This is a simple example of using the transform_iterators class to
// generate iterators that multiply the value returned by dereferencing
// the iterator. In this case we are multiplying by 2.
// Would be cooler to use lambda library in this example.
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
const int N = sizeof(x)/sizeof(int);
typedef boost::binder1st<multiplies<int>> Function;
typedef transform_iterator<Function, int*> doubling_iterator;
/*
using namespace boost::phoenix;
using boost::phoenix::arg_names::arg1;
for_each(x, x+N, cout << arg1*2 << " ");
cout << endl;
for_each(x, x+N, cout << arg1 + 4 << " ");
cout << endl;
*/
doubling_iterator i_beg(x , boost::bind1st(multiplies<int>(), 2)),
i_end(x+N, boost::bind1st(multiplies<int>(), 2));
std::cout << "multiplying the array by 2:" << std::endl;
while (i_beg != i_end)
cout << *i_beg++ << " ";
cout << endl;
cout << "adding 4 to each element in the array:" << std::endl;
copy(make_transform_iterator(x, boost::bind1st(plus<int>(), 4)),
make_transform_iterator(x+N, boost::bind1st(plus<int>(), 4)),
ostream_iterator<int>(cout, " "));
cout << endl;
return 0;
}