-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathiterator.permutation.cpp
More file actions
73 lines (57 loc) · 1.95 KB
/
iterator.permutation.cpp
File metadata and controls
73 lines (57 loc) · 1.95 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
#include <boost/iterator/permutation_iterator.hpp>
#include <boost/cstdlib.hpp>
#include <iostream>
#include <vector>
#include <deque>
#include <cassert>
#include <algorithm>
using namespace std;
using namespace boost;
ostream_iterator<int> out(cout, " ");
int main()
{
int i = 0;
typedef vector<int> element_range_type;
typedef deque <int> index_type;
static const int element_range_size = 10;
static const int index_size = 4;
element_range_type elements(element_range_size);
auto el_it = elements.begin();
auto el_end = elements.end();
for (; el_it != el_end; ++el_it)
*el_it = distance(elements.begin(), el_it);
index_type indices(index_size);
auto i_it = indices.begin();
auto i_end = indices.end();
for (; i_it != i_end; ++i_it)
*i_it = element_range_size - index_size + distance(indices.begin(), i_it);
reverse(indices.begin(), indices.end());
typedef permutation_iterator<element_range_type::iterator, index_type::iterator>
permutation_type;
permutation_type begin = make_permutation_iterator(elements.begin(), indices.begin());
permutation_type it = begin;
permutation_type end = make_permutation_iterator(elements.begin(), indices.end());
cout << "The original range is : ";
copy(elements.begin(), elements.end(), out);
cout << "\n";
cout << "The reindexing scheme is : ";
copy(indices.begin(), indices.end(), out);
cout << "\n";
cout << "The permutated range is : ";
copy(begin, end, out);
cout << "\n";
cout << "Elements at even indices in the permutation : ";
it = begin;
for (i=0; i<index_size/2; ++i, it+=2) cout << *it << " ";
cout << "\n";
cout << "Permutation backwards : ";
it = begin + (index_size);
assert(it != begin);
for (; it-- != begin ;) cout << *it << " ";
cout << "\n";
cout << "Iterate backward with stride 2 : ";
it = begin + (index_size - 1);
for (i=0; i<index_size/2; ++i, it-=2) cout << *it << " ";
cout << "\n";
return boost::exit_success;
}