2013-02-16 16 views
6

मैं सी ++ में std::map<int, int> बना रहा हूं कि मैं डिफ़ॉल्ट सॉर्ट ऑर्डर के बजाय उच्चतम से निम्नतम क्रमबद्ध क्रमबद्ध करना चाहता हूं। मेरे शोध मुझे std::greater करने के लिए नेतृत्व जो आशाजनक देखा है, लेकिन मैं एक संकलन त्रुटि मिल रही है जब इसका इस्तेमाल करने की कोशिश कर रहा:सीडी + मैप कुंजी को std :: से अधिक कैसे क्रमबद्ध करें?

invalid type argument of unary ‘*’ (have ‘int’)

मेरे मानचित्र घोषणा है:

std::map<int, int, std::greater<int> > numMap; 

और त्रुटि इस से फेंका जा रहा है समारोह: इस तरह के this के रूप में इसी तरह के सवाल करने के लिए

void Row::addNumber(int num, int pos) { 
    numMap.insert(num, pos); 
} 

जवाब एसटीडी घोषणा में कोष्ठक, यानी शामिल :: अधिक से अधिक () - लेकिन जब मैं उन लोगों को शामिल करता हूं तो मुझे फ़ंक्शन लौटने वाले फ़ंक्शन के संबंध में कई त्रुटियां मिलती हैं।

+0

जब आप मानचित्र को पीछे से पढ़ते हैं तो आपकी समस्या हल नहीं होती है? बस केह रहा हू। – fonZ

+0

क्या आप कह रहे हैं कि जब आप 'std :: map' के डिफ़ॉल्ट तुलनित्र का उपयोग करते हैं तो आपको वही त्रुटि नहीं मिलती है? क्योंकि इस मामले में इससे कोई फर्क नहीं पड़ता है। –

उत्तर

7

समस्या - अमान्य पैरामीटर के साथ std::map::insert सदस्य फ़ंक्शन का कॉल: दो पूर्णांक मान प्रदान किए गए हैं; लेकिन std::pair<int, int> होना चाहिए। कृपया संदर्भ देखें: std::map::insert

बेहतर विकल्प

सुविधा के लिए (सिर्फ नक्शा प्रकार पैरामीटर दोहराना नहीं करने के लिए), नक्शे के लिए एक typedef बनाएँ:

typedef std::map<int, int> IntMap; 

std::map है std::pair के लिए परिभाषा टाइप करें (जोड़ी प्रतिनिधित्व) - std::map::value_type। तो, उदाहरण के लिए, यदि std::map<int, int>std::map::value_typestd::pair<int, int> होगा।

class Row { 
public: 
    void Row::addNumber(int num, int pos) 
    { 
     m_numMap.insert(IntMap::value_type(num, pos)); 
    } 

private: 
    typedef std::map<int, int> IntMap; 
    IntMap m_numMap; 
}; 

विकल्प::

std::map::value_type निर्माता (इस मामले में IntMap::value_type) का उपयोग करें

  1. उपयोग std::make_pair() समारोह:

    #include <utility> 
    
    ... 
    
    void Row::addNumber(int num, int pos) 
    { 
        numMap.insert(std::make_pair(num, pos)); 
    } 
    
  2. सीधे का उपयोग std::pair निर्माता:

    void Row::addNumber(int num, int pos) 
    { 
        numMap.insert(std::pair<int, int>(num, pos)); 
    } 
    
+0

बहुत कुछ। सम्मिलित फ़ंक्शन उस तरीके से काम नहीं करता जिस तरह से आप इसकी उम्मीद कर सकते हैं। :( – Xymostech

+0

आह धन्यवाद, मैंने माना था कि सी ++ का मानचित्र सम्मिलन जावा के मानचित्र के समान ही काम करता है। स्पष्ट रूप से मुझे यह और अधिक शोध करना चाहिए था :-( – Exupery

+1

@Exupery, वैसे, अगर आपने जावा में 'हैश मैप' क्लास का उपयोग किया है , हो सकता है कि आप 'std :: unordered_map' कक्षा (** सी ++ 11 ** के बाद से उपलब्ध) का उपयोग करना चाहें - हैश-मैप कंटेनर। –

5

एक थोड़ा और अधिक सेर्गेई के जवाब (जो भी निश्चित रूप से काम करता है) की तुलना में पंडिताऊ, बजाय का उपयोग करें:

typedef std::map<int, int, std::greater<int> > MyMap; 
MyMap numMap; 

void Row::addNumber(int num, int pos) 
{ 
    numMap.insert(MyMap::value_type(num, pos)); 
} 

लाभ किया जा रहा है कि यदि आप मानचित्र के प्रकार बदलने के लिए, आप कम है बाद में बदलने के लिए कोड। और बहुत कम संभावना है लेकिन अभी भी संभव है, अगर std::map के कार्यान्वयन std::pair से कुछ और (stl के भविष्य के संस्करण में) में बदल जाता है, तो आप उस परिवर्तन के प्रति अभ्यस्त हैं।

+0

+1, हाँ, आप सही हैं: 'std :: map :: value_type' बहुत सुविधाजनक है (' std :: map' प्रकार के पैरामीटर को दोहराने के लिए नहीं)। –

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