Voglio ottenere gli elementi ordinati per il numero della loro occorrenza. Questo è quello che ho messo a punto (mHeights è uno std :: multiset):Come ordinare un multiset a un contenitore per il numero di occorrenze dell'elemento
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;
}
Quindi, prima di iniziare tutti gli elementi unici dal multiset, poi li conto e ordinarli in un nuovo contenitore (I ho bisogno dei conteggi quindi uso una mappa). Questo sembra abbastanza complicato per un compito così facile. Oltre alla HistPair, che è usata anche altrove, non esiste alcun algoritmo stl che possa semplificare questa attività, ad es. usando equal_range o sth. nello stesso modo.
Edit: mi serve il numero di occorrenze così, mi dispiace dimenticato che
sembra abbastanza succinta a me . Non riesco a immaginare che tu stia pianificando più di una linea o due dalla tua routine di creazione dell'istogramma. Un'alternativa potrebbe essere usare un 'std :: map' invece di 'std :: multiset ' e calcolare le dimensioni del contenitore mentre si inseriscono gli elementi, ma non cambierà molto. –
Rook
@nims: Questo è quello che sto facendo o ti ho frainteso. Ho bisogno del conteggio e dell'elemento – Martin
@Martin mio cattivo, l'ho trascurato. – nims