Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <type_traits>
- #include <utility>
- #include <iterator>
- #include <algorithm>
- #include <deque>
- #include <forward_list>
- #include <cstdlib>
- #include <cassert>
- template< typename iterator >
- void
- proxy_sort(iterator beg, iterator end)
- {
- static_assert(std::is_base_of< std::forward_iterator_tag, typename std::iterator_traits< iterator >::iterator_category >{});
- using reference = typename std::iterator_traits< iterator >::reference;
- using pointer = typename std::iterator_traits< iterator >::pointer;
- struct iterator_adaptor
- { // In `std::swap` makes first and last statement in `T tmp(std::move(lhs)); lhs = std::move(rhs); rhs = std::move(tmp);` a no-op.
- iterator_adaptor(reference value)
- : p(&value)
- { ; }
- iterator_adaptor(iterator_adaptor &&)
- : p(nullptr)
- { ; }
- void
- operator = (iterator_adaptor && rhs) &
- {
- if (!!rhs.p) {
- std::iter_swap(p, rhs.p);
- }
- }
- bool
- operator < (iterator_adaptor const & rhs) const
- {
- return (*p < *rhs.p);
- }
- private :
- pointer p;
- };
- std::deque< iterator_adaptor > proxy_(beg, end);
- std::sort(std::begin(proxy_), std::end(proxy_));
- }
- int
- main()
- {
- std::forward_list< int > l{5, 4, 3, 2, 1};
- std::copy(std::cbegin(l), std::cend(l), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
- proxy_sort(std::begin(l), std::end(l));
- std::copy(std::cbegin(l), std::cend(l), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment