2010-02-22 24 views
12

मेरे पास निम्नलिखित नक्शा संरचना है: map < pair < int,int >, object* > और मैं इसमें शामिल करना चाहता हूं।मानचित्र में जोड़ी को सम्मिलित करने के लिए कैसे करें

मैं इसे करना होगा कैसे के बाद से मैं एक जोड़ी और एक वस्तु सम्मिलित करने के लिए कोशिश कर रहा हूँ और मैं इस से बाहर एक जोड़ी करना चाहिए?

क्या मुझे जोड़ी और ऑब्जेक्ट से बाहर make_pair() का उपयोग करके एक नई जोड़ी बनाना चाहिए? यदि हां, तो क्या आप कृपया मुझे यह बताएं कि यह कैसे करें?

+5

आपने किस कोड का प्रयास किया है? – Mark

उत्तर

20
object * myObject = // get an object somehow 
myMap.insert(std::make_pair(std::make_pair(1,2), myObject)); 

या

typedef map<pair<int, int>, object *> MapType; 
object * myObject = // get an object somehow 
myMap.insert(MapType::value_type(std::make_pair(1,2), myObject)); 
+0

मैंने आपके पहले सुझाव का उपयोग किया - अच्छा और संक्षिप्त। बहुत बहुत धन्यवाद! – Myx

+2

यदि आप इसे अपने कोड में बहुत उपयोग कर रहे हैं तो आप पठनीयता के लिए एक सम्मिलित (जोड़ी, ऑब्जेक्ट) फ़ंक्शन के साथ एक कक्षा में मानचित्र को लपेटना चाहेंगे। –

1

वहाँ दो तरीके हैं:

typedef std::map<int,Object> map_t; 
map_t map; 
Object obj; 

std::pair<map_t::iterator, bool> result = map.insert(std::make_pair(1,obj)); // 1 

map[1] = obj; // 2 
  1. केवल तभी काम करता कुंजी पहले से मौजूद नहीं है, महत्वपूर्ण मूल्य के साथ जोड़ी के लिए इटरेटर अंक और बूल इंगित करता है कि यह डाला गया है या नहीं।

  2. आसान है, लेकिन अगर यह पहले से ही वस्तु मौजूद नहीं है पहले डिफ़ॉल्ट निर्माण किया और उसके बाद के बजाय होने का असाइन किया गया है प्रतिलिपि

निर्माण आप प्रदर्शन के बारे में चिंता करने की, बस कि क्या द्वारा चयन नहीं है, तो या आप पिछली प्रविष्टि को मिटाना नहीं चाहते हैं।

+0

सही, लेकिन सवाल ने एक कुंजी प्रकार के साथ एक मानचित्र के बारे में पूछा जो एक जोड़ी भी है। –

+0

मैं निर्भरता को देखने में विफल रहता हूं। 'sed s/1/std :: make_pair (1,1)/g' और एक उपयुक्त परिभाषित 'map_t'। यह टिप्पणियों या कुछ भी नहीं बदलता है, मैं भीड़ में छिपाने के बजाय महत्वपूर्ण बिंदुओं पर ध्यान केंद्रित करने में मदद करने के लिए सरल अवधारणाओं का प्रदर्शन करना पसंद करता हूं। –

10

आप मान लिया जाये कि सी ++ 11 या बाद में उपयोग कर रहे हैं, सबसे अच्छा तरीका शायद है:

object * myObject = // get an object somehow 
myMap.emplace({1,2}, myObject); 

मानचित्रों के लिए, emplace कि कुंजी और अलग अलग रूप में मूल्य लेता insert का एक संस्करण के रूप में सोचा जा सकता है तर्क (यह वास्तव में तर्कों का कोई संयोजन ले सकता है कि संबंधित pair प्रकार के निर्माता ले सकते हैं)। वाक्य रचनात्मक रूप से क्लीनर होने के अलावा, यह make_pair से भी अधिक कुशल है, क्योंकि make_pair आमतौर पर एक आउटपुट उत्पन्न करेगा जिसका प्रकार कंटेनर के value_type से मेल नहीं खाता है, और इसलिए यह एक अनावश्यक प्रकार रूपांतरण होता है।

मैं इस है, जो भी केवल सी ++ 11 या बाद में काम करता है की सिफारिश करने के लिए इस्तेमाल:

object * myObject = // get an object somehow 
myMap.insert({{1,2}, myObject}); 

यह emplace का थोड़ा आश्चर्य की बात दूर रहता है, लेकिन यह पूर्व में यदि कुंजी या मान काम नहीं किया प्रकार केवल चाल हैं (उदाहरण के लिए unique_ptr)। यह मानक में तय किया गया है, लेकिन आपके मानक लाइब्रेरी कार्यान्वयन ने अभी तक ठीक नहीं किया हो सकता है। यह सैद्धांतिक रूप से थोड़ा कम कुशल भी हो सकता है, लेकिन इस तरह से कि किसी भी आधे रास्ते सभ्य संकलक आसानी से अनुकूलित कर सकते हैं।

+0

मुझे लगता है कि ऑफी सीअल जवाब और यह संकलक संस्करण मानदंडों के आधार पर विलय किया जाना चाहिए – Aviv

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

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