Dukales

reorder by pattern

Aug 11th, 2015
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3.  
  4. #include <type_traits>
  5. #include <utility>
  6. #include <iterator>
  7. #include <algorithm>
  8. #include <deque>
  9. #include <forward_list>
  10.  
  11. #include <cstdlib>
  12. #include <cassert>
  13.  
  14. template< typename pattern_iterator, typename target_iterator >
  15. void
  16. pattern_sort(pattern_iterator pbeg, pattern_iterator pend, target_iterator beg, target_iterator end)
  17. {
  18.     using pattern_traits = std::iterator_traits< pattern_iterator >;
  19.     using target_traits = std::iterator_traits< target_iterator >;
  20.     static_assert(std::is_base_of< std::forward_iterator_tag, typename pattern_traits::iterator_category >{});
  21.     static_assert(std::is_base_of< std::forward_iterator_tag, typename target_traits::iterator_category >{});
  22.     struct iterator_adaptor
  23.     {
  24.        
  25.         iterator_adaptor(typename pattern_traits::reference pattern)
  26.             : p(&pattern)
  27.         { ; }
  28.        
  29.         iterator_adaptor(iterator_adaptor &&)
  30.             : p(nullptr)
  31.         { ; }
  32.        
  33.         void
  34.         operator = (iterator_adaptor && rhs) &
  35.         {
  36.             if (!!rhs.p) {
  37.                 std::swap(p, rhs.p);
  38.                 std::iter_swap(t, rhs.t);
  39.             }
  40.         }
  41.        
  42.         void
  43.         operator = (typename target_traits::reference target) &
  44.         {
  45.             t = &target;
  46.         }
  47.  
  48.         bool
  49.         operator < (iterator_adaptor const & rhs) const
  50.         {
  51.             return (*p < *rhs.p);
  52.         }
  53.        
  54.     private :
  55.        
  56.         typename pattern_traits::pointer p;
  57.         typename target_traits::pointer t = nullptr;
  58.  
  59.     };
  60.     std::deque< iterator_adaptor > proxy_(pbeg, pend);
  61.     std::copy(beg, end, std::begin(proxy_));
  62.     std::sort(std::begin(proxy_), std::end(proxy_));
  63. }
  64.  
  65. int
  66. main()
  67. {
  68.     std::forward_list< int > p{05, 04, 03, 02, 01};
  69.     std::forward_list< int > t{50, 40, 30, 20, 10};
  70.     std::copy(std::cbegin(p), std::cend(p), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  71.     std::copy(std::cbegin(t), std::cend(t), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  72.     pattern_sort(std::cbegin(p), std::cend(p), std::begin(t), std::end(t)); std::cout << std::endl;
  73.     std::copy(std::cbegin(p), std::cend(p), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  74.     std::copy(std::cbegin(t), std::cend(t), std::ostream_iterator< int >(std::cout, " ")); std::cout << std::endl;
  75.     return EXIT_SUCCESS;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment