如何在Objective-C ++ std :: map中使用NSString作为键

时间:2012-01-20 18:08:35

标签: stl objective-c++

我正在开始研究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<的智能指针中吗?

2 个答案:

答案 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)。