C++ 如何将值从NSMutableDictionary复制到映射?

C++ 如何将值从NSMutableDictionary复制到映射?,c++,objective-c,cocoa,stl,llvm,C++,Objective C,Cocoa,Stl,Llvm,我需要接受字符串键值对的NSMutableDictionary,并且需要复制到stl映射。有没有一个简单的方法? 我试过了,但没用 NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; [dictionary setObject:@"10" forKey:@"6"]; [dictionary setObject:@"10" forKey:@"7"]; [dictionary setObj

我需要接受字符串键值对的NSMutableDictionary,并且需要复制到stl映射。有没有一个简单的方法? 我试过了,但没用

NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
    [dictionary setObject:@"10" forKey:@"6"];
    [dictionary setObject:@"10" forKey:@"7"];
    [dictionary setObject:@"10" forKey:@"8"];

    NSEnumerator *enumerator = [dictionary keyEnumerator];
    NSString *key;
    while ((key = [enumerator nextObject])) {
        std::string *keyString = new std::string([key UTF8String]);
        std::string *valueString = new std::string([[dictionary objectForKey:key] UTF8String]);
        map[*keyString] = *valueString;
    }
你为什么要用新的?只需将-UTF8String的结果直接传递到映射,它就会将它们转换为std::string:

map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String];
您现有的新代码不仅毫无用处,而且还会泄漏字符串

你也应该抛弃分子。多年来,我们一直有更好的方法来列举字典。具体来说,可以使用快速枚举,也可以使用基于块的枚举。快速枚举循环如下所示:

for (NSString *key in dictionary) {
    map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String];
}
基于块的枚举如下所示:

// if map is a local variable it must be declared with __block
// like __block std::map<std::string,std::string> map;
// If it's static, global, or an instance or member variable, then it's fine as-is
[dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop){
    map[[key UTF8String]] = [value UTF8String];
}];
在这种情况下,我建议使用快速枚举循环,因为它不需要修改map的声明。

为什么要使用new?只需将-UTF8String的结果直接传递到映射,它就会将它们转换为std::string:

map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String];
您现有的新代码不仅毫无用处,而且还会泄漏字符串

你也应该抛弃分子。多年来,我们一直有更好的方法来列举字典。具体来说,可以使用快速枚举,也可以使用基于块的枚举。快速枚举循环如下所示:

for (NSString *key in dictionary) {
    map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String];
}
基于块的枚举如下所示:

// if map is a local variable it must be declared with __block
// like __block std::map<std::string,std::string> map;
// If it's static, global, or an instance or member variable, then it's fine as-is
[dictionary enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop){
    map[[key UTF8String]] = [value UTF8String];
}];

在这种情况下,我建议使用快速枚举循环,因为它不需要修改map的声明。

这太棒了。您还可以对如何进行反向操作(即将地图转换为NSMutableDictionary)发表意见吗?我可能有一个解决方案,但由于我是Obj-C的初学者,我非常希望您的输入。@kunj2aan:迭代映射,并使用[NSString stringWithUTF8String:str.C_str]将每个std::string转换为NSString*。这太棒了。您还可以对如何进行反向操作(即将地图转换为NSMutableDictionary)发表意见吗?我可能有一个解决方案,但由于我是Obj-C的初学者,我非常希望您的输入。@kunj2aan:迭代映射,并使用[NSString stringWithUTF8String:str.C_str]将每个std::string转换为NSString*。