1 #ifndef _theplu_yat_utility_sort_index_
2 #define _theplu_yat_utility_sort_index_
25 #include <boost/concept_check.hpp>
26 #include <boost/iterator/iterator_categories.hpp>
27 #include <boost/iterator/iterator_concepts.hpp>
28 #include <boost/iterator/iterator_traits.hpp>
64 template<
typename InputIterator>
65 void sort_index(InputIterator first, InputIterator last,
93 template<
typename InputIterator,
class Compare>
94 void sort_index(InputIterator first, InputIterator last,
95 std::vector<size_t>&
sort_index, Compare comp);
103 template<
typename InputIterator,
class Compare>
104 void sort_index(InputIterator first, InputIterator last,
105 std::vector<size_t>& idx, Compare comp,
106 boost::single_pass_traversal_tag);
109 template<
typename RandomAccessIterator,
class Compare>
110 void sort_index(RandomAccessIterator first, RandomAccessIterator last,
111 std::vector<size_t>& idx, Compare comp,
112 boost::random_access_traversal_tag);
115 template<
typename RandomAccessIterator,
class Compare>
116 class sort_index_Compare
119 sort_index_Compare(RandomAccessIterator it, Compare comp)
120 : data_(it), compare_(comp)
122 using boost_concepts::ReadableIterator;
123 BOOST_CONCEPT_ASSERT((ReadableIterator<RandomAccessIterator>));
124 using boost_concepts::RandomAccessTraversal;
125 BOOST_CONCEPT_ASSERT((RandomAccessTraversal<RandomAccessIterator>));
127 typename boost::iterator_reference<RandomAccessIterator>::type T;
128 BOOST_CONCEPT_ASSERT((boost::BinaryPredicate<Compare, T, T>));
131 bool operator()(
size_t i,
size_t j)
const
132 {
return compare_(data_[i], data_[j]); }
135 RandomAccessIterator data_;
146 template<
typename InputIterator>
148 std::vector<size_t>& idx)
150 typedef typename boost::iterator_value<InputIterator>::type T;
152 BOOST_CONCEPT_ASSERT((boost::LessThanComparable<T>));
157 template<
typename InputIterator,
class Compare>
159 std::vector<size_t>& idx, Compare comp)
161 BOOST_CONCEPT_ASSERT((boost::InputIterator<InputIterator>));
162 typename boost::iterator_traversal<InputIterator>::type traversal;
163 detail::sort_index(first, last, idx, comp, traversal);
172 template<
typename InputIterator,
class Compare>
173 void sort_index(InputIterator first, InputIterator last,
174 std::vector<size_t>& idx, Compare comp,
175 boost::single_pass_traversal_tag tag)
177 typedef typename boost::iterator_value<InputIterator>::type T;
179 BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<T>));
180 BOOST_CONCEPT_ASSERT((boost::SGIAssignable<T>));
181 std::vector<T> vec(first, last);
183 boost::random_access_traversal_tag());
188 template<
typename RandomAccessIterator,
class Compare>
189 void sort_index(RandomAccessIterator first, RandomAccessIterator last,
190 std::vector<size_t>& idx, Compare comp,
191 boost::random_access_traversal_tag tag)
193 sort_index_Compare<RandomAccessIterator, Compare> compare(first, comp);
197 size_t n = last-first;
200 for (
size_t i=0; i<n; ++i)
202 std::sort(idx.begin(), idx.end(), compare);
void sort_index(InputIterator first, InputIterator last, std::vector< size_t > &sort_index)
Definition: sort_index.h:147