Domanda

C'è qualche aspetto negativo di utilizzare NSSet come chiave nella NSMutableDictionary, dei trucchi di essere a conoscenza di eventuali grandi successi di performance?

Credo che le chiavi vengono copiati in contenitori di cacao, significa NSSet viene copiato al dizionario? O c'è qualche ottimizzazione che mantiene il NSSet in questo caso?

In relazione al Può un NSDictionary prendere in NSSet come chiave?

Esempio di codice:

NSMutableDictionary * dict = [NSMutableDictionary dictionary];

NSSet * set;
set = [NSSet setWithObjects:@"a", @"b", @"c", @"d", nil];
[dict setObject:@"1" forKey:set];

set = [NSSet setWithObjects:@"b", @"c", @"d", @"e", nil];
[dict setObject:@"2" forKey:set];

id key;
NSEnumerator * enumerator = [dict keyEnumerator];
while ((key = [enumerator nextObject]))
    NSLog(@"%@ : %@", key, [dict objectForKey:key]);

set = [NSSet setWithObjects:@"c", @"b", @"e", @"d", nil];
NSString * value = [dict objectForKey:set];
NSLog(@"set: %@ : key: %@", set, value);

Uscite:

2009-12-08 15:42:17.885 x[4989] (d, e, b, c) : 2
2009-12-08 15:42:17.887 x[4989] (d, a, b, c) : 1
2009-12-08 15:42:17.887 x[4989] set: (d, e, b, c) : key: 2
È stato utile?

Soluzione

  

Credo che le chiavi vengono copiati in contenitori di cacao, significa NSSet viene copiato al dizionario? O c'è qualche ottimizzazione che mantiene il NSSet in questo caso?

NSDictionaries fanno copiare le chiavi.

Un set immutabile probabilmente rispondere alle copy restituendo sé mantenuto, rendendo la “copia” praticamente gratis.

Un insieme mutevole risponderà a copy inviando copia di se stesso, che è il motivo per cui l'uso di oggetti mutabili come chiavi è generalmente una cattiva idea (non sarà in grado di trovare l'originale dopo mutazione, perché non è più uguale a confronto alla chiave nel dizionario).

Altri suggerimenti

Ooh. Sì. C'è un grande svantaggio delle prestazioni. Accade che -[NSSet hash] è implementato come [set count]. Ciò significa che se tutti i vostri insiemi hanno 2 oggetti, per esempio, allora tutti hanno lo stesso hash, e la collezione si esibiranno molto male.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top