2014-09-04 2 views
6

Есть много answers с std::vector, но как насчет std::unordered_set?Does clear() влияет на количество ведра std :: unordered_set?

Мой настоящий вопрос (тесно связанный) - это; эффективно ли использовать один и тот же неупорядоченный набор, очищая его перед каждым использованием, если я забронирую то, что я знаю, для разумного размера заранее?

+1

Я бы сказал, что это будет конкретная реализация. В стандарте указывается, что 'clear()' стирает все элементы в контейнере. –

+1

Я думаю, что [тот же аргумент применяется как для 'std :: vector :: reserve'] (http://stackoverflow.com/a/18467916):' bucket_count' является частью наблюдаемого состояния; это разрешено изменять при вставке, но явно не разрешено изменять «rehash» или «reserve» (или даже «стирать», насколько я вижу). – dyp

+0

@dyp: вы потеряли меня ... «bucket_count» ... явно не разрешено изменять «rehash» или «reserve» - последние существуют, чтобы разрешить количество bucket (таким образом, 'bucket_count()'), который должен быть изменен - ​​первый непосредственно принимает новое количество ковшей (но подлежит проверке 'size()/max_load_factor()' sity), а последний выводит его из числа ожидаемых элементов и текущего 'max_load_factor'. «явно» или нет, это то, что они делают. –

ответ

6

Формальный ответ: это зависит от реализации.

Неофициальный ответ: unordered_set внутри есть массив (своего рода) из ведра, и, скорее всего, реализация соответствует vector, поэтому этот массив не будет удален, когда clear() называется. Таким образом, вызов clear(), скорее всего, принесет некоторую пользу.

+0

Спасибо, как и ответ Джонатана Поттера; хорошо знать, что это не указано. Использование 'reserve' перед каждым использованием уже является усилением в производительности. – Sheljohn