2014-09-04 8 views
6

Es gibt viele answers mit std::vector, aber was ist mit std::unordered_set?Beeinflusst clear() die Bucket-Anzahl von std :: unordered_set?

Meine eigentliche Frage (eng verwandt) ist dies; Ist es effizient, den gleichen ungeordneten Satz wiederzuverwenden, indem ich ihn vor jedem Gebrauch lösche, wenn ich vorher reserviere, was ich für eine vernünftige Größe halte?

+1

Ich würde sagen, das wäre implementierungsspezifisch. Der Standard gibt nur an, dass 'clear()' alle Elemente im Container löscht. –

+1

Ich denke das [gleiche Argument gilt wie für 'std :: vector :: reserve'] (http://stackoverflow.com/a/18467916):' bucket_count' ist Teil des beobachtbaren Zustandes; es ist erlaubt, beim Einfügen geändert zu werden, aber es ist nicht explizit erlaubt, auf 'rehash' oder' reserve' zu ​​ändern (oder sogar auf 'löschen', soweit ich das sehen kann). – dyp

+0

@dyp: du hast mich verloren ... "' bucket_count' ... nicht explizit erlaubt auf 'rehash' oder' reserve' zu ​​ändern - die letzteren existieren, um die Anzahl der Buckets zu erlauben (also 'bucket_count()')) modifiziert werden - das erste akzeptiert direkt eine neue Anzahl von Buckets (unterliegt jedoch einer 'size()/max_load_factor()' Plausibilitätsprüfung) und letzterer leitet es aus einer Anzahl erwarteter Elemente und dem aktuellen 'max_load_factor' ab. "Explizit" oder nicht, das tun sie. –

Antwort

6

Formale Antwort ist: es hängt von der Implementierung ab.

Informal Antwort lautet: unordered_set innerhalb eines Arrays hat (irgendeiner Art) von Eimern, und höchstwahrscheinlich die Umsetzung steht im Einklang mit vector, so dass diese Anordnung wird nicht gelöscht werden, wenn clear() genannt wird. Also ruft clear() höchstwahrscheinlich einige Vorteile.

+0

Danke, wie mit Jonathan Potters Antwort; Es ist gut zu wissen, dass es nicht spezifiziert ist. Die Verwendung von "Reserve" vor jeder Verwendung ist ohnehin schon ein Leistungsgewinn. – Sheljohn