Advertisement
Guest User

histogram with Forward Iterators

a guest
Mar 6th, 2015
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <utility>
  6. #include <vector>
  7.  
  8. template <typename InputIterator, typename LessThanComparator>
  9. std::pair<typename std::iterator_traits<InputIterator>::value_type, int>
  10. get_min_count(InputIterator b, InputIterator e, LessThanComparator comp) {
  11.    typedef typename std::iterator_traits<InputIterator>::value_type vt;
  12.    if (b == e) {
  13.       return std::pair<vt, int>(vt(), 0);
  14.    }
  15.    vt minValue = *b;
  16.    int count = 1;
  17.    while (++b != e) {
  18.       vt t = *b;
  19.       if (comp(t, minValue)) {
  20.          minValue = t;
  21.          count = 1;
  22.       } else if (!comp(minValue, t)) {
  23.          ++count;
  24.       }
  25.    }
  26.    return std::pair<vt, int>(minValue, count);
  27. }
  28.  
  29.  
  30. template <typename InputIterator>
  31. std::pair<typename std::iterator_traits<InputIterator>::value_type, size_t>
  32. get_min_count(InputIterator b, InputIterator e) {
  33.    return get_min_count(b, e, std::less<typename std::iterator_traits<InputIterator>::value_type>());
  34. }
  35.  
  36. template <typename T, typename ForwardIterator>
  37. struct greaterThanFilterIterator {
  38.    typedef typename std::iterator_traits<ForwardIterator>::value_type value_type;
  39.    typedef typename std::iterator_traits<ForwardIterator>::difference_type difference_type;
  40.    typedef typename std::iterator_traits<ForwardIterator>::iterator_category iterator_category;
  41.    typedef typename std::iterator_traits<ForwardIterator>::pointer pointer;
  42.    typedef typename std::iterator_traits<ForwardIterator>::reference reference;
  43.  
  44.    T oldMin;
  45.    ForwardIterator b;
  46.    ForwardIterator e;
  47.  
  48.    greaterThanFilterIterator(const T &minValue, ForwardIterator start, ForwardIterator end) : oldMin(minValue), b(start), e(end) {
  49.       move();
  50.    }
  51.  
  52.    greaterThanFilterIterator(ForwardIterator end) : e(end) { }
  53.  
  54.    greaterThanFilterIterator operator++() {
  55.       ++b;
  56.       move();
  57.       return *this;
  58.    }
  59.  
  60.    T &operator*() { return *b; }
  61.  
  62.    bool operator==(const greaterThanFilterIterator &rhs) const {
  63.       return b == rhs.e;
  64.    }
  65.  
  66.    bool operator!=(const greaterThanFilterIterator &rhs) const {
  67.       return !(*this == rhs);
  68.    }
  69.  
  70. private:
  71.    void move() {
  72.       while ((b != e) && (!(oldMin < *b))) { ++b; }
  73.    }
  74. };
  75.  
  76. template <class T, typename ForwardIterator>
  77. struct greaterThanFilter {
  78.    greaterThanFilterIterator<T, ForwardIterator> b_;
  79.    greaterThanFilterIterator<T, ForwardIterator> e_;
  80.  
  81.    greaterThanFilter(const T &minValue, ForwardIterator b, ForwardIterator e) : b_(minValue, b, e), e_(e) { }
  82.  
  83.    greaterThanFilterIterator<T, ForwardIterator> begin() { return b_; }
  84.    greaterThanFilterIterator<T, ForwardIterator> end() { return e_; }
  85.  
  86.    const greaterThanFilterIterator<T, ForwardIterator> begin() const { return b_; }
  87.    const greaterThanFilterIterator<T, ForwardIterator> end() const { return e_; }
  88. };
  89.  
  90.  
  91.  
  92.  
  93. template <typename ForwardIterator, typename OutputIterator>
  94. void
  95. histogram(ForwardIterator b, ForwardIterator e, OutputIterator o) {
  96.    typedef typename std::iterator_traits<ForwardIterator>::value_type vt;
  97.    typedef typename std::iterator_traits<ForwardIterator>::difference_type dt;
  98.    typedef typename std::pair<vt, dt> pairType;
  99.  
  100.    if (b == e) { return; }
  101.  
  102.    pairType p = get_min_count(b, e);
  103.    do {
  104.       *o++ = p;
  105.       greaterThanFilter<vt, ForwardIterator> f(p.first, b, e);
  106.       p = get_min_count(f.begin(), f.end());
  107.    } while (p.second != 0);
  108. }
  109.  
  110.  
  111. int main(int argc, char *argv[]) {
  112.    std::vector<int> values;
  113.    for (int i = 1; i < argc; ++i) { values.push_back(atoi(argv[i])); }
  114.    std::vector<std::pair<int,int> > h;
  115.    histogram(values.begin(), values.end(), std::back_inserter(h));
  116.    for (int i = 0; i < h.size(); ++i) {
  117.       fprintf(stdout, "[%d,%d]\n", h[i].first, h[i].second);
  118.    }
  119.    return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement