2012-01-20 25 views
6

Bir Objective-C++ projesinde çalışmaya başlıyorum, iki dilin sentezinin, herhangi bir ağır iş tasarımı yapmadan önce nasıl hissettirdiğini hissediyorum. Otomatik Referans Sayımı'nın C++ ile nasıl entegre edildiğine çok meraklıyım: NSObjects için akıllı işaretleyicilerin eşdeğerini, STL konteynerlerinde düzgün bir şekilde tutma/serbest bırakma işlemine denk geliyoruz (bkz. David Chisnall'ın makalesi, http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3).NSString anahtar olarak nasıl kullanılır Objective-C++ std :: map

STL haritasını, NSStrings'dan C++ değerlerine typesafe eşleştirmesi olarak kullanmak istiyorum. Bu eşleme düzgün bellek yönetimini ele alır, ARC ile

std::map<NSString*, MyType> mapping 

olarak bir eşleme bildirebilirsiniz. Ancak NSString değer semantiğine uygun şekilde uymuyor çünkü -[NSString compare:] yerine işaretçi karşılaştırmalarını kullanıyor.

İşaretçi karşılaştırması yerine dize karşılaştırması kullanmak için bir STL haritası elde etmenin en iyi yolu nedir?
std::less<NSString*> konusunda uzmanlaşmalı mıyım?
std::map<NSString*, MyType, MyCompare> gibi açık bir karşılaştırıcı mı bildirmeliyim?
operator<'u uygulayan bir akıllı işaretçide NSString* anahtarlarını sarmalı mıyım?

+0

En iyi nasıl tanımlarsınız? İstenen sonuç hız belleği nedir? – madmik3

+0

İlginç. ARC ile objc işaretçilerinin çok kolay işleyeceği hakkında hiçbir fikrim yoktu. Chisnall'ın makalesine bakarak, bunun çalışması için harita beyannamenize __weak veya __strong eklemeniz gerekecek. Aksi halde onlar POD'lar ve işe yaramaz. (Karşılaştırıcıya nadiren baktığım ve sonradan unuttuğum için karşılaştırıcıya bir cevabım yok. Verdiğin sırada denemeliyim.) – smparkes

+0

Eğer işaretçiler güçlü ise, onları işaretlemeniz gerekmez. Sadece zayıflarsa. Her neyse, açık bir karşılaştırıcıyla giderdim. – bames53

cevap

9

Böyle özel karşılaştırma NSString en karşılaştırmak işlevini çağırır nesneyi, bir şey ister ki: hepsi NSString değişmezleri ise yönetilmeyen NSString örneklerinin

#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

Bahşiş için teşekkürler! Eşleme, karşılaştırma nesnesi ile iyi çalışır. Nils için tutarlı bir sıralama kullanmak için koşulu değiştirdim (önce boş dizelerden önce sıralarlar). –

0

işaretçi karşılaştırmalar, gayet iyi. iow, bu şartlar altında MRC'de çalışacaktı, elbette ki çift dize değerleri yok ve değer karşılaştırılıyor. Aksi takdirde, Ross'un genel olarak daha yararlı cevabı (+1) bakınız.

İlgili konular