2014-09-04 13 views
6

Istnieje wiele answers z std::vector, ale co z std::unordered_set?Czy clear() wpływa na liczbę pakietów std :: unordered_set?

Moje prawdziwe pytanie (blisko związane) jest to; czy efektywne jest ponowne użycie tego samego nieuporządkowanego zestawu przez wyczyszczenie go przed każdym użyciem, jeśli wcześniej zarezerwuję to, co wiem, że jest rozsądnym rozmiarem?

+1

Powiedziałbym, że będzie to specyficzne dla implementacji. Standard określa tylko, że 'clear()' usuwa wszystkie elementy w kontenerze. –

+1

Myślę, że [ten sam argument stosuje się do 'std :: vector :: reserve'] (http://stackoverflow.com/a/18467916):' bucket_count' jest częścią obserwowalnego stanu; można go zmienić przy wstawianiu, ale nie można go jawnie zmieniać na 'rehash' lub' reserve' (lub nawet na 'erase', o ile widzę ..). – dyp

+0

@dyp: zgubiłeś mnie ... "' bucket_count' ... nie można jawnie zmieniać na 'rehash' lub' reserve' "- te ostatnie istnieją, aby zezwolić na liczbę segmentów (stąd' bucket_count() ') do modyfikacji - pierwszy bezpośrednio akceptuje nową liczbę segmentów (ale podlega kontroli "size()/max_load_factor()'), a ta ostatnia czerpie ją z wielu przewidywanych elementów i bieżącego "max_load_factor". "wyraźne" czy nie, to właśnie robią. –

Odpowiedz

6

Formalna odpowiedź brzmi: zależy to od wdrożenia.

Nieformalne odpowiedź brzmi: unordered_set wewnątrz ma tablicę (pewnego rodzaju) z wiadra, a najprawdopodobniej realizacja jest zgodna z vector, więc ta tablica nie zostanie usunięty, gdy clear() nazywa. Tak więc wywołanie clear() najprawdopodobniej przyniesie pewne korzyści.

+0

Dzięki, podobnie jak z odpowiedzią Jonathana Pottera; dobrze wiedzieć, że nie jest określony. Używanie 'reserve' przed każdym użyciem i tak już zwiększa wydajność. – Sheljohn

Powiązane problemy