2012-01-20 19 views
6

में कुंजी के रूप में एनएसएसटींग का उपयोग कैसे करें I उद्देश्य-सी ++ प्रोजेक्ट पर काम शुरू कर रहा हूं, मुझे लगता है कि मैं किसी भी भारी-ड्यूटी डिज़ाइन से पहले दोनों भाषाओं के संश्लेषण को महसूस करता हूं। मैं सी ++ के साथ स्वचालित संदर्भ गणना को एकीकृत करने के तरीके से बहुत चिंतित हूं: हमें NSObjects के लिए स्मार्ट पॉइंटर्स के समतुल्य मिलते हैं जो एसटीएल कंटेनरों (सीएफ डेविड चिस्नेल के लेख http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3 पर) को ठीक से बनाए/रिलीज़ करते हैं।उद्देश्य-सी ++ std :: कुंजी

मैं एसटीएल मानचित्र का उपयोग NSStrings से सी ++ मानों में टाइपएफ़ मैपिंग के रूप में करना चाहता हूं। मैं

std::map<NSString*, MyType> mapping 

एआरसी के साथ मैपिंग घोषित कर सकता है, यह मैपिंग मेमोरी प्रबंधन को सही तरीके से संभालती है। लेकिन यह NSString मूल्य अर्थशास्त्र का सही पालन नहीं करता है, क्योंकि यह -[NSString compare:] के बजाय पॉइंटर तुलना का उपयोग कर रहा है।

पॉइंटर तुलना के बजाय स्ट्रिंग तुलना का उपयोग करने के लिए एसटीएल मानचित्र प्राप्त करने का सबसे अच्छा तरीका क्या है?
क्या मुझे std::less<NSString*> विशेषज्ञता का प्रयास करना चाहिए?
क्या मुझे std::map<NSString*, MyType, MyCompare> जैसे स्पष्ट तुलनित्र घोषित करना चाहिए?
क्या मुझे लागू करने वाले स्मार्ट पॉइंटर में NSString* कुंजी लपेटनी चाहिए?

+0

आप कैसे सर्वश्रेष्ठ परिभाषित करते हैं? वांछित परिणाम गति स्मृति क्या है? – madmik3

+0

दिलचस्प। मुझे नहीं पता था कि ओबीजेसी पॉइंटर्स एआरसी के साथ इतनी आसानी से काम करेंगे। चिस्नेल के लेख को देखते हुए, आपको काम करने के लिए अपने मानचित्र घोषणा में __weak या __strong जोड़ना होगा। अन्यथा वे पीओडी हैं और यह काम नहीं करेगा। (मुझे तुलनित्र मुद्दे का कोई जवाब नहीं है क्योंकि मैं इसे शायद ही कभी करता हूं और बाद में भूल जाता हूं। मैं इसे आपके द्वारा दिए गए क्रम में कोशिश करता हूं।) – smparkes

+0

मुझे लगता है कि अगर पॉइंटर्स मजबूत हैं तो आपको उन्हें चिह्नित करने की आवश्यकता नहीं है, केवल अगर वे कमज़ोर हैं। वैसे भी, मैं एक स्पष्ट तुलनित्र के साथ जाना होगा। – bames53

उत्तर

9

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

अप्रबंधित NSString उदाहरणों में से
#include <functional> 
#include <map> 

struct CompareNSString: public std::binary_function<NSString*, NSString*, bool> { 
    bool operator()(NSString* lhs, NSString* rhs) const { 
     if (rhs != nil) 
      return (lhs == nil) || ([lhs compare: rhs] == NSOrderedAscending); 
     else 
      return false; 
    } 
}; 

std::map<NSString*, MyType, CompareNSString> mapping; 
+0

टिप के लिए धन्यवाद! मानचित्रण तुलना वस्तु के साथ अच्छी तरह से काम करता है। मैंने नील्स के लिए एक सतत क्रम का उपयोग करने के लिए स्थिति को बदल दिया (वे पहले तारों को खाली तारों से पहले क्रमबद्ध करते हैं)। –

0

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

यदि नहीं, तो रॉस को आम तौर पर अधिक उपयोगी उत्तर (+1) देखें।

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