1

文字列のキーと値のペアの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;
    }
4

1 に答える 1

4

そもそもなんで使っnewてんの?-UTF8Stringの結果をマップに直接渡すだけで、それらがstd::strings に変換されます。

map[[key UTF8String]] = [[dictionary objectForKey:key] UTF8String];

既存のnewコードは役に立たないだけでなく、文字列をリークしています。


も捨てる必要がありNSEnumeratorます。ここ数年、辞書を列挙するためのより良い方法がありました。具体的には、高速列挙を使用するか、ブロックベースの列挙を使用できます。高速列挙ループは次のようになります。

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

于 2013-01-20T21:45:40.277 に答える