
On 2/11/2013 5:09 AM, Evgeny Panasyuk wrote:
11.02.2013 2:17, Nathan Ridge:
P.S. Consider implementation of companion - transform_adjacent. Maybe even consider version which accepts "count of adjacent elements within each iteration" as template non-type parameter. Or maybe choose some another approach involving Boost.Range?
I think a more general approach would be a Boost.Range-style range adaptor [1] that presents a view of the range where elements in the view are pairs of (references to, if desired) elements in the underlying range. You can then use standard algorithms like for_each and transform on the adapted range.
I have written such an adaptor in the past and called it 'adjacent_paired'. I've also seen (can't remember where) the name 'windowed' used for the more general version which presents a view of tuples of N adjacent elements.
Yes, I was thinking about something like that - use tuple views.
Just for example(of tuple views):
int arr[] = {0,1,2,3,4,5};
for_each ( make_zip_iterator( make_tuple(arr+0, arr+1) ), make_zip_iterator( make_tuple(end(arr)-1, end(arr)) ), cout << lambda::_1 << " " );
or
boost::for_each ( combine(arr | sliced(0,size(arr)-1), arr | sliced(1,size(arr))), cout << lambda::_1 << " " );
output: (0 1) (1 2) (2 3) (3 4) (4 5)
By the way, is combine in boost/range/combine.hpp in public api? I don't see it on website.
Nice find! I've been missing a zip_range! A few useful additions would be a corresponding adaptor and exposed range type(s) that are currently in the detail namespace. Jeff