Tôi muốn lấy các phần tử được sắp xếp theo số lần xuất hiện của chúng. Đây là những gì tôi đã đưa ra (mHeights là một std :: MultiSet):Cách sắp xếp một bội số cho vùng chứa theo số lần xuất hiện phần tử
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;
}
Vì vậy, đầu tiên tôi thực hiện tất cả các yếu tố độc đáo từ MultiSet, sau đó tôi đếm chúng và sắp xếp chúng vào một container mới (I cần số lượng để tôi sử dụng bản đồ). Điều này có vẻ khá phức tạp cho một nhiệm vụ dễ dàng như vậy. Ngoài HistPair, được sử dụng ở nơi khác, không có bất kỳ thuật toán stl nào để đơn giản hóa tác vụ này, ví dụ: sử dụng equal_range hoặc sth. như nhau.
Edit: Tôi cần số lần xuất hiện là tốt, xin lỗi tôi quên mất rằng
Trông khá ngắn gọn với tôi . Tôi không thể tưởng tượng bạn có kế hoạch nhiều hơn một hoặc hai dòng trong thói quen tạo biểu đồ của bạn. Một thay thế có thể là sử dụng một 'std :: map' thay vì 'std :: multiset ' và tính toán kích thước thùng của bạn khi bạn chèn các phần tử, nhưng nó sẽ không thay đổi nhiều. –
Rook
@nims: Đó là những gì tôi đang làm hoặc tôi hiểu lầm bạn. Tôi cần đếm và yếu tố – Martin
@ Bắt đầu xấu của tôi, bỏ qua nó. – nims