2013-04-06 4 views
5

में एकाधिक कुंजियों के साथ मानचित्र मैं अपने नाम और उनके सूचकांक दोनों द्वारा डेटा स्टोर करना चाहता हूं। दूसरे शब्दों में, मैं string वस्तुओं को नाम मैप करना चाहता हूं और उन्हें एक कस्टम ऑर्डर भी देना चाहता हूं।सी ++

मैं पहले के साथ आया था std::vectorstring कुंजी और ऑब्जेक्ट के जोड़े के। आदेश वेक्टर में स्थिति द्वारा दिया गया था।

std::vector<std::pair<std::string, object> > 

लेकिन इस दृष्टिकोण के बाद से यह स्वतः ही string नाम की विशिष्टता की जांच नहीं करता करने से इनकी हो रहा है। इसके अलावा वस्तुओं को अपने आदेश से पहले समूह में गलत करना गलत लगता है, क्योंकि तर्कसंगत रूप से उनका पहला आदेश भेद नाम है।

मुझे एक डेटा संरचना की आवश्यकता है जो नाम और अनुक्रमणिका दोनों के उपयोग की अनुमति देता है।

std::magic<std::string, unsigned int, object> collection; 

// access by either string or unsigned int key 
collection.insert("name", 42, new object()); 
collection["name"] 
collection[42] 

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

+1

आप दो 'std :: map' वस्तुओं की जरूरत है। –

+0

@ एनएम। मुझे स्ट्रिंग नाम से ऑर्डर करने की आवश्यकता नहीं है। तो मूल रूप से मुझे आदेश के लिए 'std :: vector' और नामों के लिए' std :: unordered_map' की आवश्यकता है। लेकिन मेरा सवाल यह है कि अगर पहले से ही कोई समाधान है या कम से कम एक बेहतर तरीका है। – danijar

+1

'unordered_map' एक संभावना है यदि आप C++ 11 का उपयोग कर रहे हैं। सूचकांक के लिए, 'वेक्टर' और 'मैप'/'unordered_map' के बीच एक विकल्प निर्धारित होता है कि जब आप अपने संग्रह से चीजों को हटाते हैं तो क्या होता है। यदि आपको स्थिर सूचकांक की परवाह नहीं है, तो आप 'वेक्टर' का उपयोग कर सकते हैं। मुझे लगता है कि दो कंटेनर * बेहतर तरीका है। –

उत्तर

4

बूस्ट केवल इस उद्देश्य के लिए कंटेनर का एक सेट प्रदान करता है, देखें: boost::multiindex