// Boost general library sorting_view.hpp header file ---------------------------// // what: indirect view of sorted array // who: contributed by Boris Kats // when: February 2016 // Copyright © 2007 Boris Kats // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_SORTING_VIEW_INCLUDED #define BOOST_SORTING_VIEW_INCLUDED #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include #include #include namespace boost { template struct iterator_less: public std::binary_function { bool operator()(const Iterator & x, const Iterator & y) const { typedef typename std::iterator_traits::value_type value_type; return std::less()(*x,*y); } }; template struct iterator_greater: public std::binary_function { bool operator()(const Iterator & x, const Iterator & y) const { typedef typename std::iterator_traits::value_type value_type; return std::greater()(*x,*y); } }; template< class Iterator, class Compare > inline std::vector sorting_view(const Iterator begin, const Iterator end, Compare compare) { int size = (int)std::distance(begin,end); std::vector view(size); std::vector temp(size); for(int i = 0; i < size; ++i) temp[i] = begin+i; std::sort(temp.begin(),temp.end(),compare); for(int i = 0; i < size; ++i) view[i] = (int)std::distance(begin,temp[i]); return view; } template< class Iterator> inline std::vector sorting_view(const Iterator begin, const Iterator end) { return sorting_view(begin,end,iterator_less()); } template inline void apply_view(const Iterator & begin, const Iterator & end, const std::vector & view) { typedef typename std::iterator_traits::value_type value_type; int size = (int)std::distance(begin,end); assert(size == (int)view.size()); std::vector res(size); for(int i = 0; i < size; ++i) res[i] = *(begin+view[i]); for(int i = 0; i < size; ++i) *(begin +i) = res[i]; } } // namespace #endif