我正在开始研究Objective-C ++项目,在我做任何重型设计之前,先了解这两种语言的合成方式。我对自动引用计数与C ++集成的方式非常感兴趣:我们得到了NSObjects
的智能指针,可以在STL容器中正确处理保留/释放(参见David Chisnall在http://www.informit.com/articles/article.aspx?p=1745876&seqNum=3的文章)
我想将STL映射用作从NSStrings
到C ++值的类型安全映射。我可以将映射声明为
std::map<NSString*, MyType> mapping
使用ARC,此映射可以正确处理内存管理。但它没有正确遵循NSString
值语义,因为它使用指针比较而不是-[NSString compare:]
。
让STL地图使用字符串比较而不是指针比较的最佳方法是什么?
我应该尝试专攻std::less<NSString*>
吗?
我应该声明一个明确的比较器,如std::map<NSString*, MyType, MyCompare>
吗?
我应该将NSString*
键包装在实现operator<
的智能指针中吗?
答案 0 :(得分:9)
你想要一个调用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;
答案 1 :(得分:0)
非托管NSString
实例的指针比较很好,如果它们都是NSString
个文字。嘿,这可以在这些条件下在MRC中工作,前提是当然没有重复的字符串值,并且值是被比较的。
如果没有,请参阅Ross通常更有用的答案(+1)。