2012-12-18 32 views
5

इसे बनाया गया और प्रारंभ करने के बाद std :: मानचित्र की तुलना विधि को बदलना संभव है? या शायद इसे बनाने के बाद ही ??std :: नक्शा परिवर्तन key_comp प्रारंभ करने के बाद

मैं किसी ऐसे वर्ग के व्यवहार को बदलना चाहता हूं जिसमें एक नक्शा शामिल है जिसे मैं परिभाषा नहीं बदल सकता। मैं एक और नक्शा पास करके शायद इसकी तुलना व्यवहार बदलना चाहता हूं।

+0

क्या आप यहां सीधे ऐसा करने के लिए एक फ़ंक्शन देखते हैं: http://en.cppreference.com/w/cpp/container/map? यदि नहीं, तो उत्तर नहीं है ... – Nim

+2

यह एक टेम्पलेट पैरामीटर है, इसलिए इसे संकलन समय पर ठीक किया जाना है। इसे बदलना कंटेनर के प्रकार को बदल देगा। – v154c1

उत्तर

4

हो सकता है कि यह संभव है, इस अपरीक्षित है:

  1. अपने स्वयं के कस्टम तुलनित्र है, जो आंतरिक रूप से तुलना समारोह
  2. के वास्तविक कार्यान्वयन के लिए एक सूचक है परिभाषित के निर्माता को यह का एक उदाहरण दर्रा नक्शा (आप भी इस तुलनित्र का उपयोग कर नक्शा टाइप करने के लिए है।)
  3. वास्तविक कार्यान्वयन बाद में सेट करें (मानचित्र उपयोग करने से पहले), आप के बाद यह निर्धारित करते हैं, आप आंतरिक पर प्रभाव नहीं पता ...

परीक्षण किया है, और यह अगर वहाँ विनाशकारी हो सकता है पेड़ में आइटम हैं ऊपर करने के लिए, तथापि तुलना समारोह को बदलने के लिए संभव है ...

वैसे भी - यह सब भी गड़बड़ .... लगता है

+0

यह ठीक है। नक्शा खाली है। – djWann

+0

@djWann मुझे लगता है कि कॉलिंग के ओवरहेड एक फ़ंक्शन पॉइंटर के माध्यम से तुलना करते हैं, यदि आप इसकी परवाह करते हैं तो हर बार 'मानचित्र' संचालन को धीमा कर देगा। – rici

+0

@djWann यदि नक्शा खाली है, तो क्यों न केवल एक नया उपयोग करें? या तो दो पूरी तरह से अलग वस्तुएं या जब तक तुलनित्र एक ही हस्ताक्षर है: 'my_map = std :: map <...> (& new_compare);' – rioki

1

यह संभव नहीं है। लेकिन आप वैकल्पिक तुलना मानदंडों के साथ एक नया नक्शा बना सकते हैं, और दो पुनरावर्तक कन्स्ट्रक्टर को पहले तत्वों का उपयोग करके मानचित्र को तुरंत चालू करने के लिए बना सकते हैं।

bool C1(const K&, const K&); 
bool C2(const K&, const K&); 

std::map<K, V, C1> orig; 
.... 
std::map<K, V, C2> alternative(orig.begin(), orig.end()); 
1

नहीं यह बाद से यह एक टेम्पलेट तर्क के माध्यम से नक्शे में संकलित है संभव नहीं है,।

देखें: http://www.cplusplus.com/reference/map/map/ की तुलना करें जो आप ढूंढ रहे हैं।

आप क्या करने की कोशिश कर रहे हैं?

जब से तुम हाथ आप कुंजी के रूप में उपयोग कर रहे हैं में वर्ग है, तो आप या तो < ऑपरेटर या संदर्भ के लिए प्रतिक्रिया करने के लिए की तुलना समारोह को लागू कर सकते हैं। चूंकि आप तुलनात्मक कार्य के रूप में constructor पर पूरी तरह से निर्मित ऑब्जेक्ट पास कर सकते हैं, इसलिए संदर्भ निर्भर करुणा को लागू करने के लिए सबकुछ पास करना संभव होना चाहिए। सवाल यह है कि आप क्यों चाहेंगे?

यह खराब विचार std :: मानचित्र की तुलना में परिवर्तन को बदलने के लिए खराब है, क्योंकि इसका परिणाम अपरिभाषित व्यवहार होगा। बस इस तथ्य के आधार पर कि std :: map की सामग्री "क्रमबद्ध" है (शायद एक आरबी-पेड़)। यदि आप ऑर्डरिंग फ़ंक्शन बदलते हैं तो आप अचानक लॉजिकल ऑर्डर बदल देंगे; लेकिन नक्शा जादूगर रूप से खुद को पुन: व्यवस्थित नहीं करेगा। डालने या खोजने के लिए अगली कॉल शायद आप जो भी उम्मीद करते हैं वह नहीं करेगी।

2

नहीं, यह संभव नहीं है। तुलनित्र मानचित्र के प्रकार का हिस्सा है। सवाल यह पूछने से अलग नहीं है कि क्या आप फ़्लोटिंग पॉइंट नंबरों को स्टोर करने के लिए int बदल सकते हैं।

इससे भी महत्वपूर्ण बात, तुलनित्र द्वारा प्रदान आदेश नक्शे की आंतरिक संरचना का एक अभिन्न हिस्सा है। यदि आप ऑर्डरिंग बदलना चाहते थे, तो डेटा संरचना अब एक सतत स्थिति में नहीं होगी।,

std::map<T, V, Comp1> m1 = /* ... */; 
std::map<T, V, Comp2> m2(m1.begin(), m1.end()); 

वैकल्पिक रूप से आप प्रकार std::map<std::reference_wrapper<T const>, std::reference_wrapper<V>, Comp2> का एक दूसरा नक्शा बनाने और संदर्भ से पॉप्युलेट कर सकते हैं: केवल अनुकूल विकल्प नई व्यवस्था के संबंध में वर्ष नक्शे के तत्वों से एक नया नक्शा के पुनर्निर्माण के लिए है, लेकिन जो पहले से ही संभव है मूल मानचित्र पर, लेकिन Comp2 के अनुसार आदेश दिया गया। उस स्थिति में दो मानचित्रों को सिंक में बनाए रखने की आपकी ज़िम्मेदारी है। Boost.Multiindex जैसे एक उन्नत कंटेनर आपके लिए एक सुरक्षित फैशन में ऐसा कर सकते हैं।