Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

The Data Structure

Boost , The Boost C++ Libraries BoostBook Documentation Subset , Chapter 41. Boost.Unordered

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Контейнеры состоят из нескольких «ковш», каждое из которых может содержать любое количество элементов. Например, на следующей диаграмме показано<unordered_set>с 7 ведрами, содержащими 5 элементов,<A>,<B>,<C>,<D>и<E>(это только для иллюстрации, контейнеры обычно имеют больше ведер).

Чтобы решить, в какое ведро поместить элемент, контейнер применяет хеш-функцию<Hash>к ключу элемента (для<unordered_set>и<unordered_multiset>ключ является целым элементом, но упоминается как ключ, так что та же терминология может использоваться для наборов и карт). Это возвращает значение типа<std::size_t>.<std::size_t>имеет гораздо больший диапазон значений, чем число ведер, так что контейнер применяет другое преобразование к этому значению, чтобы выбрать ведро для размещения элемента.

Получение элементов для данного ключа просто. Тот же процесс применяется к ключу, чтобы найти правильное ведро. Затем ключ сравнивают с элементами в ведре, чтобы найти любые элементы, которые соответствуют (используя предикат равенства<Pred>). Если хеш-функция сработала хорошо, элементы будут равномерно распределены между ведрами, поэтому необходимо будет изучить только небольшое количество элементов.

Более подробная информация о хеш-функциях и предикатах равенства содержится в следующем разделе.

На рисунке видно, что<A>и<D>были помещены в одно и то же ведро. При поиске элементов в этом ведре производится до 2 сравнений, что замедляет поиск. Это называется столкновением. Чтобы держать вещи быстро, мы стараемся свести столкновения к минимуму.

Table 41.1. Methods for Accessing Buckets

метод

Описание

<size_typebucket_count()const> Количество ведер.
<size_typemax_bucket_count() const> Верхняя граница по количеству ведер.
<size_typebucket_size(size_typen)const> Количество элементов в ведре<n>.
<size_typebucket(key_typeconst&k)const> возвращает индекс ведра, который будет содержать k
<local_iterator begin(size_typen);> Return begin and end iterators for bucket n.
<local_iterator end(size_typen);>
<const_local_iterator begin(size_typen)const;>
<const_local_iteratorend(size_typen)const;>
<const_local_iterator cbegin(size_typen)const;>
<const_local_iteratorcend(size_typen)const;>


Controlling the number of buckets

По мере добавления большего количества элементов в неупорядоченный ассоциативный контейнер количество элементов в ведрах будет увеличиваться, вызывая ухудшение производительности. Для борьбы с этим контейнеры увеличивают количество ведра по мере вставки элементов. Вы также можете сказать контейнеру изменить счет ведра (если требуется), позвонив<rehash>.

Стандарт оставляет большую свободу для исполнителя, чтобы решить, как количество ведер выбрано, но он делает некоторые требования, основанные на «факторе нагрузки» контейнера, среднем количестве элементов на ведро. Контейнеры также имеют «максимальный коэффициент нагрузки», который они должны стараться поддерживать ниже.

Вы не можете контролировать количество ведра напрямую, но есть два способа повлиять на него:

  • Укажите минимальное количество ведер при строительстве контейнера или при вызове<rehash>.
  • Предложите максимальный коэффициент нагрузки, позвонив<max_load_factor>.

<max_load_factor>не позволяет установить максимальный коэффициент нагрузки самостоятельно, он просто позволяет датьподсказку. И даже в этом случае проект стандарта не требует от контейнера особого внимания к этому значению. Единственный раз, когда коэффициент нагрузкитребуется, чтобы быть меньше максимального, после вызова<rehash>. Но большинство реализаций будут стараться удерживать количество элементов ниже максимального коэффициента нагрузки и устанавливать максимальный коэффициент нагрузки таким же, как и или близкий к подсказке, если только подсказка не является необоснованно маленькой или большой.

Table 41.2. Methods for Controlling Bucket Size

метод

Описание

<X(size_typen)>

Постройте пустой контейнер с ведрами не менее<n><X>.

<X(InputIteratori,InputIterator j, size_typen)>

Постройте пустой контейнер с по меньшей мере<n>ведрами и вставьте элементы из диапазона<i>,<j>(57) (тип контейнера).

<floatload_factor()const>

Среднее количество элементов на ведро.

<floatmax_load_factor()const>

Возвращает текущий максимальный коэффициент нагрузки.

<floatmax_load_factor(floatz)>

Изменяет максимальный коэффициент загрузки контейнера, используя<z>в качестве подсказки.

<voidrehash(size_type n)>

Изменяет количество ведер так, чтобы там было хотя бы n ведер, и так, чтобы коэффициент нагрузки был меньше максимального коэффициента нагрузки.


Iterator Invalidation

Не уточняется, каким образом функции члена, отличные от<rehash>, влияют на количество ковшов, хотя<insert>разрешается обесценивать итераторы только тогда, когда вставка приводит к тому, что коэффициент нагрузки превышает или равен максимальному коэффициенту нагрузки. Для большинства реализаций это означает, что вставка изменит только количество ведер, когда это произойдет. Несмотря на то, что итераторы могут быть признаны недействительными по вызовам<insert>и<rehash>, указатели и ссылки на элементы контейнера никогда не признаются недействительными.

Аналогично использованию<reserve>для<vector>s, может быть хорошей идеей позвонить<rehash>, прежде чем вставлять большое количество элементов. Это приведет к дорогостоящей перетасовке и позволит вам хранить итераторы, зная, что они не будут признаны недействительными. Если вы вставляете<n>элементов в контейнер<x>, вы можете сначала позвонить:

x.rehash((x.size() + n) / x.max_load_factor() + 1);

PrevUpHomeNext

Статья The Data Structure раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 41. Boost.Unordered может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 41. Boost.Unordered ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 17:36:04/0.010293006896973/1