33 #ifndef SHARK_CORE_FUNCTIONAL_H 34 #define SHARK_CORE_FUNCTIONAL_H 36 #include <boost/range/numeric.hpp> 37 #include <boost/range/algorithm/nth_element.hpp> 38 #include <boost/bind.hpp> 45 template<
class RandomAccessIterator,
class Rng>
46 void partial_shuffle(RandomAccessIterator begin, RandomAccessIterator middle, RandomAccessIterator end, Rng& rng){
47 std::random_shuffle(begin,end,rng);
59 template<
class Iterator,
class Rng>
60 void shuffle(Iterator begin, Iterator end, Rng& rng){
62 Iterator next = begin;
63 for (std::size_t index = 2; ++next != end; ++index){
64 swap(*next, *(begin + rng(index)));
70 template<
class RandomAccessIterator>
71 void partial_shuffle(RandomAccessIterator begin, RandomAccessIterator middle, RandomAccessIterator end){
83 typedef typename boost::range_iterator<Range>::type iterator;
86 std::size_t medianPos = (size+1)/2;
87 iterator medianIter = boost::begin(range)+medianPos;
89 boost::nth_element(range,medianIter);
96 Range adaptorCopy(rangeAdaptor);
108 template<
class Range>
110 typedef typename boost::range_iterator<Range>::type iterator;
111 typedef typename boost::iterator_value<iterator>::type value_type;
113 iterator begin = boost::begin(range);
114 iterator end = boost::end(range);
119 value_type median = *medianIter;
120 iterator left = std::partition(begin,medianIter,boost::bind(std::less<value_type>(),_1,median));
121 iterator right = std::partition(medianIter,end,boost::bind(std::equal_to<value_type>(),_1,median));
129 if (left - begin >= end - right)
138 template<
class Range>
140 Range adaptorCopy(rangeAdaptor);