Come verificare se std :: map contiene una chiave senza fare insert?


Risposte:


305

Utilizzare my_map.count( key ); può restituire solo 0 o 1, che è essenzialmente il risultato booleano che desideri.

In alternativa my_map.find( key ) != my_map.end()funziona anche.


40
@John: che puzza di ottimizzazione prematura. Su GCC (e sono sicuro che i sistemi più ragionevoli), map::countè implementato come find(__x) == end() ? 0 : 1;. Perché multimappotresti avere un argomento di performance, ma questa non è una domanda di OP e preferisco ancora l'eleganza.
Potatoswatter,

42
No, l'argomento dell'ottimizzazione prematura è valido solo se l'ottimizzazione richiede uno sforzo che in questo caso non lo è.
markh44,

13
Non vero. Non è prematuro se semplifica la lettura del codice o elimina le spese generali non necessarie. In questo caso, se count () è implementato tramite find () comunque, quindi chiamare find () elimina direttamente una chiamata di funzione ... ergo, è un'ottimizzazione matura . Trovo che usare la chiamata find () sia anche più ovvio, ma questa è una preferenza puramente personale.
Tim Keating

9
Non è un'ottimizzazione prematura essere consapevoli del perfezionamento delle funzioni della libreria prima di prendere l'abitudine di usarle. In questo caso, hai ragione, non importa, ma nemmeno la minuscola differenza stilistica tra trovare e contare. Penso che porti troppo lontano la retorica dell '"ottimizzazione prematura". Dovresti prendere tutte le abitudini di ottimizzazione "gratuite" che puoi trovare e usarle per lo sviluppo quotidiano. È quando i programmatori soccombono alla trappola del pagamento dei costi in leggibilità / tempo di sviluppo / ecc., Tutto per "guadagni di prestazione" non misurati che la retorica dell'ottimizzazione prematura diventa il consiglio giusto da dare.
VoidStar,

10
Lontano, std dovrebbe semplicemente aggiungere un dannato has(k)/ contains(k)come ogni altra classe di mappe sane sul pianeta. Cattivo design dell'interfaccia. L'approccio find () è troppo dettagliato e count(k)sicuramente l' approccio non è in parità semantica has(k). Del resto neanche lo è find(k). Controlla il conteggio delle visualizzazioni su questa domanda.
Jarrod Smith,

46

La risposta di Potatoswatter va bene, ma preferisco usare findo lower_boundinvece. lower_boundè particolarmente utile perché l'iteratore restituito può essere successivamente utilizzato per un inserimento suggerito, se si desidera inserire qualcosa con la stessa chiave.

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

Questo è leggermente diverso da come dice che lo sta facendo ... l'unica differenza è che il calcolo di valuepuò essere saltato se l'inserzione non è necessaria.
Potatoswatter,

1
Certo, capisco che l'OP non si preoccupa di inserire, quindi una lower_boundsoluzione basata su basi è eccessiva. Ho appena menzionato la mia risposta "per completezza"; come ho detto, il tuo è perfettamente adeguato. :-)
Chris Jester-Young,

4
Sì, questa è una buona risposta e non sono d'accordo con nulla. Indico solo la relazione con l'alternativa inserta priori. In realtà, c'è un'altra differenza se si utilizza a multimap, il lower_boundmetodo si inserisce all'inizio dell'intervallo equivalente, mentre il insertmetodo semplice aggiunge alla fine dell'intervallo.
Potatoswatter,

2
Non la risposta alla domanda, ma la mia scarsa domanda che mi ha portato qui alla risposta giusta ... Devo fare l'inserimento / aggiornamento. : D
Hunter-Orionnoir,

1
@Hunter Puoi mostrarmi il tuo codice? Se non è massiccio, probabilmente posso recensirlo per te.
Chris Jester-Young,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.