Quiero obtener los elementos ordenados por el número de su aparición. Esto es lo que he llegado con (mHeights es un std :: conjunto múltiple):Cómo ordenar un multiset a un contenedor por el número de ocurrencias de elementos
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;
}
Así que primero tomo todos los elementos singulares del conjunto múltiple, luego les cuento y clasificarlos en un nuevo contenedor (I necesito los conteos así que uso un mapa). Esto parece bastante complicado para una tarea tan fácil. Además del HistPair, que también se usa en otros lugares, ¿no hay algún algoritmo stl que simplifique esta tarea, p. usando equal_range o sth. igual.
Editar: Necesito el número de ocurrencias, así, lo siento, se olvidó de que
parece bastante conciso para mí . No puedo imaginar que pienses más de una o dos líneas en tu rutina de creación de histogramas. Una alternativa podría ser utilizar un 'std :: map' en lugar de 'std :: multiset ' y calcular los tamaños de los contenedores al insertar elementos, pero no cambiará mucho. –
Rook
@nims: Eso es lo que estoy haciendo o no te he entendido bien. Necesito el recuento y el elemento – Martin
@Martin mi mal, lo pasé por alto. – nims