Я хочу отсортировать элементы по количеству их вхождений . Вот что у меня получилось (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, который также используется в других местах, нет ли какого-либо алгоритма stl, который упростил бы эту задачу, например. используя equal_range или sth. одинаково.
Редактировать: мне также нужно количество вхождений, извините, я забыл об этом