2014-09-04 19 views
6

Ci sono un sacco di answers con std::vector, ma che dire di std::unordered_set?Does clear() influenza il conteggio bucket di std :: unordered_set?

La mia vera domanda (strettamente correlata) è questa; è efficiente riutilizzare lo stesso set non ordinato svuotandolo prima di ogni utilizzo, se riservo in anticipo quello che so essere di dimensioni ragionevoli?

+1

Direi che sarebbe un'implementazione specifica. Lo standard specifica solo che 'clear()' cancella tutti gli elementi nel contenitore. –

+1

Penso che [lo stesso argomento vale per 'std :: vector :: reserve'] (http://stackoverflow.com/a/18467916):' bucket_count' fa parte dello stato osservabile; è permesso di essere modificato al momento dell'inserimento, ma non è permesso esplicitamente di cambiare su 'rehash' o' reserve' (o anche su 'cancella' per quanto posso vedere ..). – dyp

+0

@dyp: mi hai perso ... "' bucket_count' ... non è permesso esplicitamente di cambiare in 'rehash' o' reserve' "- quest'ultimo esiste per consentire il numero di bucket (quindi' bucket_count() ') da modificare: il primo accetta direttamente un nuovo numero di bucket (ma è soggetto a un controllo di integrità 'size()/max_load_factor()' e quest'ultimo lo deriva da un numero di elementi anticipati e dal valore corrente di 'max_load_factor'. "esplicito" o non è quello che fanno. –

risposta

6

La risposta formale è: dipende dall'implementazione.

risposta informale è: unordered_set ha all'interno di un array (di qualche tipo) di benne, e molto probabilmente l'applicazione è coerente con vector, quindi questo array non sarà cancellata quando clear() si chiama. Quindi chiamare probabilmente clear() darà qualche beneficio.

+0

Grazie, come con la risposta di Jonathan Potter; è bello sapere che non è specificato. Usare 'reserve' prima di ogni utilizzo è già un guadagno in termini di prestazioni. – Sheljohn