2012-06-15 16 views
5

मैं उनके अवसर की संख्या से क्रमबद्ध तत्व प्राप्त करना चाहता हूं। यह है कि मैं क्या के साथ आए हैं है (mHeights एक std :: मल्टीसेट है): मैं मल्टीसेट से सभी अद्वितीय तत्व ले,तत्व अवसरों की संख्या से एक कंटेनर में एक मल्टीसेट को सॉर्ट करने के लिए कैसे करें

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; 
} 

तो सबसे पहले तो मैं उन्हें गिनती और (एक नई कंटेनर में उन्हें सॉर्ट मैं गिनती की ज़रूरत है इसलिए मैं एक मानचित्र का उपयोग करता हूं)। यह इतना आसान काम के लिए काफी जटिल लग रहा है। हिस्टपेयर के अलावा, जिसे कहीं और भी उपयोग किया जाता है, वहां कोई भी एसएलएल एल्गोरिदम नहीं है जो इस कार्य को सरल बना देगा। बराबर_रेंज या एसएचएच का उपयोग करना। एक जैसे।

संपादित करें: मैं भी आवृत्तियां की संख्या की जरूरत है, खेद मुझे लगता है कि

+1

मेरे लिए काफी संक्षिप्त लग रहा है । मैं कल्पना नहीं कर सकता कि आप अपनी हिस्टोग्राम निर्माण दिनचर्या में से एक या दो से अधिक योजना बना रहे हैं। 'Std :: multiset ' के बजाय 'std :: map ' का उपयोग करने का विकल्प हो सकता है और तत्वों को सम्मिलित करते समय अपने बिन आकारों को काम कर सकते हैं, लेकिन यह अधिक नहीं बदलेगा। – Rook

+0

@nims: यही वह है जो मैं कर रहा हूं या मैंने आपको गलत समझा। मुझे गिनती और तत्व – Martin

+0

@ मार्टिन मेरे खराब की जरूरत है, इसे अनदेखा किया। – nims

उत्तर

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 
+0

धन्यवाद। लैम्ब्डा बस आसान हैं ;-) हालांकि मैं यह उल्लेख करना भूल गया कि मुझे भी मायने रखती है, लेकिन आपके समाधान में एकीकृत होना मुश्किल नहीं होना चाहिए – Martin

+0

वहां आप मेरे उत्तर को संपादित करते हैं। – mfontanini

+0

फिर से धन्यवाद !!! – Martin

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^