2009-05-28 18 views
5

द्वारा मानचित्र तत्व को हटाकर मैं यह संक्षिप्त रखूंगा।मूल्य

मैं स्ट्रिंग्स और ऑब्जेक्ट पॉइंटर्स के बीच एक नक्शा रखने की कोशिश कर रहा हूं, और इस तरह, मैं std :: map का उपयोग करता हूं। मेरे पास एक प्रबंधक है जो एक वैश्विक वर्ग है जो मानचित्र का ट्रैक रखता है, और जब भी किसी ऑब्जेक्ट के विनाशक को बुलाया जाता है, तो यह प्रबंधक को बताता है कि इसे हटा दिया गया है।

ऑब्जेक्ट के लिए मानचित्र के माध्यम से खोजना एकमात्र तरीका है। क्या इस समस्या के लिए एक कुशल एसटीएल समाधान है? क्या कोई नक्शा कुंजी के साथ खोज में कुशल है और साथ ही मौजूद है?

उत्तर

8

कोई भी मूल्य की तुलना करके पुनरावृत्ति के अलावा std :: मानचित्र के साथ ऐसा करने का कोई प्रभावी तरीका नहीं है।

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

या वैकल्पिक रूप से आप प्रबंधक वर्ग पर एक रिवर्स मानचित्र रख सकते हैं। कुंजी के लिए अनिवार्य रूप से मूल्य। इस तरह आप बाद में हटाने के लिए कुंजी की गणना करने के लिए इसका उपयोग कर सकते हैं।

+0

धन्यवाद! मैंने वस्तु को अपने आप को स्टोर करने के बारे में भी नहीं सोचा था। एक दूसरा नक्शा होने के बजाय निश्चित रूप से एक बेहतर समाधान। –

+0

+1, मैं अपना जवाब हटा दूंगा क्योंकि यह आपके जैसा ही लगता है। –

1

Boost Multi-Index Containers लाइब्रेरी पर एक नज़र डालें।

+0

ध्यान दें कि बिडरेक्शनल मानचित्र का उपयोग करने के लिए आपको अद्वितीय होने के लिए दोनों कुंजी और मानों की आवश्यकता है। std :: मानचित्र केवल अद्वितीय कुंजी की आवश्यकता है। –

4

SGI's documentation for the STL को देखते हुए,

मानचित्र महत्वपूर्ण संपत्ति है कि मानचित्र में एक नए तत्व डालने कि मौजूदा तत्वों को बिंदु iterators को अमान्य नहीं है। मानचित्र से तत्व को मिटाना पाठ्यक्रम को छोड़कर, किसी भी इटरेटर को अमान्य कर देता है, वास्तव में मिटाए गए तत्व को इंगित करता है।

तो आप अपने ऑब्जेक्ट के अंदर मानचित्र में एक इटरेटर स्टोर कर सकते हैं, और इसे अपनी प्रविष्टि को हटाने के लिए निरंतर समय की लुकअप कुंजी के रूप में उपयोग कर सकते हैं।