2010-07-13 17 views
5

संरक्षित करने के लिए मैं शुरू में एक ही कुंजी के साथ कई मान संग्रहीत करने के लिए एक std::multimap का उपयोग कर बाहर शुरू कर दिया है, लेकिन फिर मुझे पता चला कि यह एक ही कुंजी के साथ मूल्यों के बीच प्रविष्टि क्रम बनाए रखने के नहीं है। This answer का दावा है उसके boost::multi_index::multi_index_container साथ किया जा सकता है, लेकिन कोई उदाहरण देता है। दस्तावेज़ों को देखते हुए, उस उपयोग के कोई उदाहरण नहीं हैं, और मैं इस बात का उपयोग करने के तरीके के बारे में सिर या पूंछ नहीं बना सकता। मैं कम उपयोग किए जाने वाले बूस्ट पुस्तकालयों से खराब दस्तावेज की अपेक्षा करने आया हूं, लेकिन यह केक लेता है। क्या कोई मुझे ट्यूटोरियल या उदाहरण में इंगित कर सकता है जो दिखाता है कि यह जिस तरह से मैं चाहता हूं, या शायद खुद को एक उदाहरण भी प्रदान करता हूं?बढ़ावा multi_index_container का उपयोग कर प्रविष्टि आदेश

+0

आप इस एक बहु नक्शा करने की आवश्यकता है? – doublep

+0

हाँ, मैं करता हूं। मेरे पास एक ही कुंजी के साथ कई मान हैं। – rmeador

उत्तर

6

आप दो सूचकांकों साथ boost::multi_index का उपयोग करके इस लक्ष्य को हासिल कर सकते हैं: ordered_non_unique और random_access (जो प्रविष्टि आदेश में रखना होगा) (जो एक ही कुंजी के साथ मूल्यों की अनुमति देता है)।

struct some { 
    long key; 
    int data; 
    int more_data; 
    // etc. 
}; 

typedef multi_index_container< 
    some, 
    indexed_by<  
    random_access<>, // keep insertion order 
    ordered_non_unique< member<some, long, &some::key> > 
    > 
> some_mic_t; 
+1

इस उत्तर का समर्थन, बढ़ावा प्रलेखन से: ** रैंडम एक्सेस सूचकांक लगातार समय स्थितीय का उपयोग और यादृच्छिक अभिगम iterators के साथ मुक्त-आदेश दृश्यों रहे हैं। यादृच्छिक एक्सेस इंडेक्स में तत्व डिफ़ॉल्ट रूप से सम्मिलन के क्रम के अनुसार क्रमबद्ध होते हैं ** –

0

कैसे एक

map<int, vector<string> > 

या

map<int, list<string> > 

@Kirill के बारे में: अच्छा जवाब। मुझे संदेह है कि बूस्ट की random_access काफी धीमी हो सकती है, क्योंकि यह सभी कुंजियों को एक ही संगत संरचना में बनाए रखने के लिए सभी तारों को मजबूर कर देगी। जबकि प्रश्नकर्ता बस प्रत्येक कुंजी के मैप किए गए मानों के सेट के भीतर संरक्षित होने का आदेश चाहता है।

+0

'random_access' एक अतिरिक्त अनुक्रमणिका है। आप खोज के लिए 'order_non_unique' का उपयोग करते हैं, फिर परिणामी सीमा के माध्यम से पुनरावृत्ति के लिए 'random_access' का उपयोग करते हैं। यह धीमा नहीं है। –

+0

(मैंने mult_index को बहुत कुछ उपयोग किया है, लेकिन random_index नहीं है, इसलिए मैं इनमें से किसी के बारे में भी निश्चित नहीं हूं) @ किरील: दो अंक: @rmeador मूल्यों के बीच सम्मिलन आदेश को संरक्षित करने में सक्षम होना चाहता है एक ही कुंजी के साथ "। एक कुंजी को देखते हुए, पूरी यादृच्छिक अनुक्रमणिका को तुरंत प्राप्त करने के लिए कैसे उपयोग किया जा सकता है? मुझे संदेह है कि मैंने जो संरचना सुझाई है वह ऐसा करने का एकमात्र तरीका हो सकता है। और मैं मतलब है कि नए तत्व की प्रविष्टि, आवश्यकता से धीमी हो सकती है के रूप में पूरे यादृच्छिक सूचकांक पुराना हो चुका संभावित है। –

+1

@Kirill:, स्पष्ट करने के लिए एक बार ordered_non_unique (अवर्गीकृत) मान एक भी कुंजी के लिए इसी की एक सीमा की पहचान की है, तुम कैसे तो (जल्दी) कर मूल्यों की है कि सेट सॉर्ट करने के लिए random_access का उपयोग करें? मूल्यों का यह सेट एक बड़े random_access अनुक्रमणिका में समान रूप से फैल सकता है। Random_access रेंज में इटरेटिंग कुंजी को क्रम में नहीं रखेगी। –

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