5

要素を出現回数でソートしたいと思います。これは私が思いついたものです(mHeightsはstd :: multisetです):

namespace{
  template<class U,class T>
  class HistPair{
    public:
      HistPair(U count,T const& el):mEl(el),mNumber(count){      
      }
      T const&  getElement()const{return mEl;}

      U getCount()const{return mNumber;}
    private:
      T mEl;
      U mNumber;
  };

  template<class U,class T>
  bool operator <(HistPair<U,T> const& left,HistPair<U,T> const& right){
    return left.getCount()< right.getCount();
  }
}

std::vector<HistPair<int,double>  > calcFrequentHeights(){
  typedef HistPair<int,double> HeightEl;
  typedef std::vector<HistPair<int,double>  > Histogram;
  std::set<double> unique(mHeights.begin(),mHeights.end());
  Histogram res;
  boostForeach(double el, unique) {
    res.push_back(HeightEl(el,mHeights.count(el)));    
  }
  std::sort(res.begin(),res.end());
  std::reverse(res.begin(),res.end()); 
  return res;
}

したがって、最初にマルチセットからすべての一意の要素を取得し、次にそれらをカウントして新しいコンテナーに並べ替えます(カウントが必要なので、マップを使用します)。これは、このような簡単な作業では非常に複雑に見えます。他の場所でも使用されているHistPairを除いて、equal_rangeやsthを使用するなど、このタスクを単純化するstlアルゴリズムはありません。同様に。

編集:発生回数も必要です、申し訳ありませんがそれを忘れてしまいました

4

1 に答える 1

6

std::setこのスニペットは、、ラムダ、およびstd::multiset::count:を組み合わせることにより、必要な処理を実行します。

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

int main() {
    std::multiset<int> st;
    st.insert(12);
    st.insert(12);
    st.insert(12);
    st.insert(145);
    st.insert(145);
    st.insert(1);
    st.insert(2);

    std::set<int> my_set(st.begin(), st.end());
    std::vector<int> my_vec(my_set.begin(), my_set.end());
    std::sort(my_vec.begin(), my_vec.end(), 
      [&](const int &i1, const int &i2) {
          return st.count(i1) < st.count(i2);
      }
    );

    for(auto i : my_vec) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}

ベクトルを逆にすることをお勧めします。これは以下を出力します:

1 2 145 12

編集:アイテム数も必要であることを考慮に入れて、これはそれを行います:

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>

int main() {
    typedef std::vector<std::pair<int, int>> MyVector;
    std::multiset<int> st;
    st.insert(12);
    st.insert(12);
    st.insert(12);
    st.insert(145);
    st.insert(145);
    st.insert(1);
    st.insert(2);

    std::set<int> my_set(st.begin(), st.end());
    MyVector my_vec;
    my_vec.reserve(my_set.size());

    for(auto i : my_set) 
        my_vec.emplace_back(i, st.count(i));

    std::sort(my_vec.begin(), my_vec.end(), 
      [&](const MyVector::value_type &i1, const MyVector::value_type &i2) {
          return i1.second < i2.second;
      }
    );

    for(const auto &i : my_vec)
        std::cout << i.first << " -> " << i.second << std::endl;
}

どの出力:

1 -> 1
2 -> 1
145 -> 2
12 -> 3
于 2012-06-15T16:31:47.857 に答える