2016-11-27 13 views
6

में अधिक/कम फ़ंक्शन ऑब्जेक्ट्स मैं फ़ंक्शन ऑब्जेक्ट दस्तावेज़ों से अधिक, कम के लिए चला गया हूं। हालांकि मैं समझता हूं कि इसमें क्या है, मुझे अभी तक यह नहीं मिला है। मेरे कंटेनर को आरोही या अवरोही क्रम में एक बड़े प्रकार का उपयोग करेंगे? मैं विशेष रूप से उलझन में हूं क्योंकि निम्नलिखित दो पंक्तियां विपरीत चीजें कर रही हैं।सी ++

std::priority_queue<int, std::vector<int>, std::greater<int> > q2; 

for(int n : {1,8,5,6,3,4,0,9,7,2}) 
    q2.push(n); 

print_queue(p2); 

यह प्रिंट 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 लेकिन,

int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; 
std::sort(x,x+10,std::greater<int>()); 

मुद्रण इस देना होगा 10, 9, 8, 7, 6, 5, 4, 3, 2, 1.

यह अच्छा होगा अगर कोई वर्णन कर सके कि मेरे उदाहरणों में 'बड़ा' कैसे काम करता है, यह कहने के बजाय कि सामान्य रूप से 'अधिक' कैसे काम करता है।

+0

आपको यह सहायक मिल सकता है [std :: sort और std :: std :: sort] के साथ अधिक का उपयोग करने के बारे में भ्रम (http://stackoverflow.com/questions/14828476/confusion-about-using-stdless-and- stdgreater-with-stdsort) – MikeT

+0

@ माइकट: उस के माध्यम से जाना था, अभी भी भ्रम था। हालांकि, दाई और स्टोरीटेलर के उत्तरों से अधिक समझ प्राप्त करना, धन्यवाद। –

उत्तर

4

यह आरोही होगा, आप हमेशा कतार के सबसे छोटे तत्व को पॉप करेंगे। ऑर्डर रिलेशनशिप के विपरीत एक प्राथमिकता कतार प्रकार दिया जाता है।

डिफ़ॉल्ट टेम्पलेट परिभाषा इस तरह दिखता है:

template< 
    class T, 
    class Container = std::vector<T>, 
    class Compare = std::less<typename Container::value_type> 
> class priority_queue; 

यह less<>()(lhs, rhs) लागू होता है "सबसे बड़ी" आरएचएस तत्व प्राप्त करने के लिए। लेकिन आपके मामले में, यह "सबसे बड़ा" rhs तत्व प्राप्त करने के लिए greater<>()(lhs, rhs) लागू करेगा (जो निश्चित रूप से सबसे छोटा होगा)।

std::sort, दूसरी ओर, आपके द्वारा दिए गए ऑर्डर प्रकार को संरक्षित करता है। तो std::less आरोही क्रम में क्रमबद्ध करेगा, और std::greater अवरोही क्रम में क्रमबद्ध करेगा।

+0

डिफ़ॉल्ट टेम्पलेट परिभाषा में, primary_queue std :: less का उपयोग करता है। तो, डिफ़ॉल्ट रूप से, किसी भी बाहरी मज़ेदार का उपयोग किए बिना, क्या इसे आरोही क्रम में प्रिंट नहीं करना चाहिए? फिर डिफ़ॉल्ट रूप से उतरने का पालन क्यों करता है? क्षमा करें, आंशिक रूप से इसे अभी प्राप्त करें। फिर भी यह नहीं देख सकता कि इसे "सबसे बड़ा" rhs तत्व क्यों मिलेगा। –

+0

@ अश्विनबास्करन, टेम्पलेट फ्लेक्टर प्रकार को ब्लैक बॉक्स के रूप में मानता है। ब्लैक बॉक्स तत्वों को कुछ नियमों के अनुसार आदेश देता है। नियम के अनुसार हमेशा एक "सबसे बड़ा" तत्व होता है, लेकिन पूर्णांक के नियमित क्रम के अनुसार इसे "सबसे बड़ा" नहीं होना चाहिए, क्या यह इसे स्पष्ट बनाता है? – StoryTeller

+0

हां, मैं अब समझ सकता हूं। अधिक/कम फ़ैक्टर मूल रूप से नियमों के अनुसार संख्याओं को क्रमबद्ध करते हैं। डिफ़ॉल्ट रूप से, primary_queue std :: कम का उपयोग करता है। और मुझे लगता है कि, नियम "सबसे बड़ा" नंबर सबसे कम पूर्णांक मूल्य वाला है। तो, यह पहले दिखाई देना चाहिए। और प्राथमिकता_क्यू डिफ़ॉल्ट रूप से आरोही क्रम का पालन नहीं करेगा? मुझे पता है कि मैं कहीं गलत हो रहा हूं, बस यह पता नहीं लगा सकता कि कहां है। –

1

std::greater<int> पूर्णांक के सॉर्ट-ऑर्डर को उलट देता है।

std::priority_queuedequeues the next largest element by default, इसलिए std::greater<int> का उपयोग करके आप इसे बदल रहे हैं ताकि यह इसके बजाय अगले सबसे छोटे तत्व को हटा दे।

इसी तरह, std::sort डिफ़ॉल्ट रूप से तत्वों को आरोही क्रम में क्रमबद्ध करेगा, लेकिन std::greater<int> का उपयोग करके आप एक अवरोही क्रमबद्ध क्रम देखेंगे।

+0

इससे समझना आसान हो जाता है। तो, क्या यह सोचना सुरक्षित है कि हमेशा सभी कंटेनर/कंटेनर एडाप्टर के लिए प्राकृतिक सॉर्टिंग-ऑर्डर को उलट देगा? –