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

标签 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< 的智能指针中的键?

最佳答案

您需要一个调用 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;

关于STL - 如何在 Objective-C++ std::map 中使用 NSString 作为键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8945909/

相关文章:

c++ - iOS 中 Objective-C++ 中的灵活数组成员

objective-c - 您如何将 glDrawElements 与 GL_UNSIGNED_INT 一起用于索引?

c++ - 返回对迭代器的引用是一个好习惯吗? (这还有道理吗)?

c++ - 智能指针作为多态性的类成员

c++ - 20,000 个小对象的 vector 与指向 20,000 个堆对象的 20,000 个对象指针的 vector

c++ - 从不在 map2 中的 map1 中查找最大元素

iphone - #include<vector> 没有这样的文件或目录

properties - 使用 std::vector<> 作为 Objective-C 属性

c++ - std::vector 中 back() 的实现

c++ - multimap 累积值