2010-04-04 20 views
5

के साथ सी ++ न्यूनतम ढेर मैं एक संरचना प्रकार के लिए सी ++ में एक न्यूनतम ढेर को लागू करने की कोशिश कर रहा हूं। मैंने इस प्रकार का एक वेक्टर बनाया, लेकिन जब मैंने उस पर make_heap का उपयोग किया, तो यह क्रैश हो गया, जो समझ में आता है क्योंकि यह नहीं जानता कि ढेर में वस्तुओं की तुलना कैसे करें। एक संरचना प्रकार के लिए मैं एक मिनी-हीप (यानी, शीर्ष तत्व हमेशा ढेर में सबसे छोटा) कैसे बना सकता हूं?उपयोगकर्ता द्वारा परिभाषित प्रकार

struct नीचे है:

struct DOC{ 

int docid; 
double rank; 

}; 

मैं रैंक सदस्य का उपयोग डॉक्टर संरचनाओं की तुलना करना चाहते। यह मैं कैसे करूंगा?

मैं एक तुलनित्र वर्ग के साथ एक प्राथमिकता कतार उपयोग करने की कोशिश, लेकिन वह भी दुर्घटनाग्रस्त हो गया, और यह भी जब क्या मैं वास्तव में जरूरत है वैसे भी एक ढेर है जो उसके अंतर्निहित आधार के रूप में एक ढेर का उपयोग करता है एक डेटा संरचना का उपयोग करने मूर्खतापूर्ण लगता है।

आपको बहुत बहुत धन्यवाद, bsg

+0

"यह क्रैश" की आपकी परिभाषा क्या है? निश्चित रूप से, यदि आपके पास कोई तुलना करने वाला फ़ैक्टर या ऑपरेटर नहीं है <फ़ंक्शन आपको * संकलन त्रुटियां * मिल रही हैं। – sellibitze

+0

नहीं, मैं वास्तव में नहीं था। निश्चित रूप से प्राथमिकता कतार के साथ नहीं, जिस पर ओवरलोडेड ऑपरेटर परिभाषित था, और मैं make_heap के साथ भी नहीं सोचता। हालांकि यह हो सकता है कि बाद के मामले में मुझे संकलन त्रुटि मिली। पहली बार, हालांकि, यह ठीक संकलित लेकिन रनटाइम पर दुर्घटनाग्रस्त हो गया। – bsg

+0

यदि आप केवल दो तर्कों के साथ make_heap का उपयोग करने का प्रयास करते हैं, तो आपके पास अपने स्ट्रक्चर प्रकार के लिए ऑपरेटर <होना चाहिए। यदि आप नहीं करते हैं, तो आपको संकलन त्रुटियां मिलेंगी। इतना ही आसान। – sellibitze

उत्तर

2

एक तुलना ऑपरेटर जोड़ें:

struct DOC{ 

    int docid; 
    double rank; 
    bool operator<(const DOC & d) const { 
     return rank < d.rank; 
    } 
}; 

संरचनाएं लगभग हमेशा उपयोगी एक निर्माता हो सकता है, तो मैं भी जोड़ना होगा:

DOC(int i, double r) : docid(i), rank(r) {] 

को संरचना भी।

+1

जहां तक ​​मैं यह कह सकता हूं, "अधिकतम ढेर" का कारण बन जाएगा। लेकिन वह एक "न्यूनतम ढेर" चाहता है जिसके लिए एक मज़ेदार की आवश्यकता होती है जो सच हो जाती है और केवल तभी जब पहला तर्क दूसरे से बड़ा होता है। – sellibitze

+0

बहुत बहुत धन्यवाद! मैं एक प्राथमिकता कतार का उपयोग कर समाप्त हुआ, क्योंकि इसमें मेरे पास आवश्यक कार्यों में से अधिक था, लेकिन मैंने एक कन्स्ट्रक्टर बनाया और < and > ऑपरेटरों को ओवरलोड किया जैसा आपने दिखाया और यह काम किया! – bsg

+0

@bsg, अगर इस तरह से "यह काम करता है", तो आपने गलत सवाल पूछा और "अधिकतम ढेर" जो आप चाहते थे। मन बना लो। – sellibitze

5

तुलना के लिए बस अपना खुद का "मज़ेदार" बनाएं। चूंकि आप एक "मिनट ढेर" चाहते हैं कि आपके तुलना समारोह ऑपरेटर से अधिक की तरह व्यवहार करना चाहिए:

#include <iostream> 
#include <vector> 
#include <algorithm> 

struct doc { 
    double rank; 
    explicit doc(double r) : rank(r) {} 
}; 

struct doc_rank_greater_than { 
    bool operator()(doc const& a, doc const& b) const { 
     return a.rank > b.rank; 
    } 
}; 

int main() { 
    std::vector<doc> docvec; 
    docvec.push_back(doc(4)); 
    docvec.push_back(doc(3)); 
    docvec.push_back(doc(2)); 
    docvec.push_back(doc(1)); 
    std::make_heap(docvec.begin(),docvec.end(),doc_rank_greater_than()); 
    std::cout << docvec.front().rank << '\n'; 
} 

यह महत्वपूर्ण है कि आप हमेशा आगे ढेर प्रक्रियाओं में एक ही तुलना समारोह का उपयोग करें।

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