Неофициальный выпуск, загруженный в хранилище, для использования с Boost 1.35.0. Включил многие предложения из обзора.
Улучшена портативность благодаря ускоренному регрессионному тестированию.
Исправьте много опечаток и более четкий текст в документации.
Исправьте плавающую точку в<std::size_t>преобразование при расчете размеров от максимального коэффициента нагрузки и используйте<double>в расчете для большей точности.
Семантика перемещения - полная поддержка, когда доступны ссылки на rvalue, эмулируемые с использованием сокращенной версии библиотеки Adobe Move, когда они отсутствуют.
Замените поддержку, когда доступны ссылки на rvalue и вариадный шаблон.
Более эффективное распределение узлов, когда доступны ссылки на значение r и вариадный шаблон.
Билет 2237: Докажите, что операторы равенства и неравенства не определены для двух объектов, если их предикаты равенства не эквивалентны. Спасибо Даниэлю Крüглер.
Билет 1710: Используйте большой список простых чисел. Спасибо Торстену Оттосену и Hervé Brönnimann.
Используйтевыровненное хранилищедля хранения типов. Это меняет способ использования распределителя для построения узлов. Он использовался для построения узла с двумя вызовами к методу распределителя<construct>— один раз для указателей и один раз для значения. Теперь он строит узел с помощью одного вызова, а затем строит значение, используя конструкцию на месте.
Добавьте поддержку списков инициализаторов C++0x, где они доступны (в настоящее время только g++ 4.4 в режиме C++0x).
Билет 2975: Храните основной список в качестве последовательности препроцессора, чтобы он всегда получал правильную длину, если он снова изменится в будущем.
Билет 1978: Внедрение<emplace>для всех компиляторов.
Билет 2908,Билет 3096: Некоторые обходные пути для старых версий борланда, включая добавление явных деструкторов ко всем контейнерам.
Оригинальная версия широко использовала макросы, чтобы обойти плохую поддержку шаблонов старых компиляторов. Но поскольку я больше не поддерживаю эти компиляторы, и использование макросов стало бременем для обслуживания, было переписано использование шаблонов вместо макросов для классов реализации.
Контейнер objcet теперь меньше благодаря использованию<boost::compressed_pair>для EBO и немного отличающегося буфера функций - теперь вместо указателя члена используется болт.
Ведра распределяются лениво, что означает, что создание пустого контейнера не выделяет никакой памяти.
Поддержка инстанцирования контейнеров с неполными типами значений.
Уменьшение количества предупреждений (в основном в тестах).
Улучшенная совместимость кодежера.
Билет 3693: Добавьте<erase_return_void>в качестве временного обходного пути для тока<erase>, который может быть неэффективным, потому что он должен найти следующий элемент, чтобы вернуть итератор.
Добавьте шаблонный поиск перегрузки для совместимых ключей.
Билет 3966:<erase_return_void>теперь<quick_erase>, который являетсятекущим предшественником для решения медленного стирания итератором, хотя есть большая вероятность, что это может измениться в будущем. Старое название метода остается для обратной совместимости, но считается устаревшим и будет удалено в будущем выпуске.
Используйте Boost.Exception.
Прекратите использовать устаревшие<BOOST_HAS_*>макросы.
Это серьезное изменение, которое было преобразовано в использование Boost. Move эмулирует движения и более соответствует стандарту C++11. См. раздел«Соответствие»для деталей.
Контейнер теперь соответствует требованиям сложности C++11, но для этого используется немного больше памяти. Это означает, что<quick_erase>и<erase_return_void>больше не требуются, они будут удалены в будущей версии.
Поддержка C++11 привела к некоторым изменениям:
Сравнение равенства было изменено на спецификацию C++11. В контейнере с эквивалентными ключами элементы в группе с равными ключами должны быть в одном порядке, чтобы считаться равными, теперь они могут быть перестановкой друг друга. Старое поведение определяет макрос<BOOST_UNORDERED_DEPRECATED_EQUALITY>.
Поведение свопа отличается, когда два контейнера, подлежащие обмену, имеют неравные распределители. Раньше он выделял новые узлы, используя соответствующие распределители, теперь он меняет распределители, если распределитель имеет структуру члена<propagate_on_container_swap>, так что<propagate_on_container_swap::value>верно.
Функции распределителя<construct>и<destroy>называются необработанными указателями, а не типом распределителя<pointer>.
<emplace>используется для эмуляции вариадных пар конструкторов, которые появились в ранних черновиках C++0x. Поскольку они были удалены, это больше не так. Он эмулирует новые<piecewise_construct>парные конструкторы - только вам нужно использовать<boost::piecewise_construct>. Использовать старую эмуляцию вариадных констуркторов определяют<BOOST_UNORDERED_DEPRECATED_PAIR_CONSTRUCT>.
Билет 6905: Сделайте пространства имен в макросах совместимыми с<bcp>пользовательскими пространствами имен. Исправлено Люком Эллиоттом.
Удалите некоторые из меньшего простого числа ведер, так как они могут сделать столкновения вполне вероятными (например, кратные 5 очень распространены, потому что мы использовали основание 10).
На старых версиях Visual C++ используйте реализацию библиотеки контейнеров<allocator_traits>, так как это с большей вероятностью сработает.
На машинах с 64-битным std::size_t используйте мощность 2 ведра, с функцией хеширования Томаса Ванга, чтобы выбрать, какой из них использовать. Модуль очень медленный для 64-битных значений.
Обратили некоторые внутренние изменения в способ создания узлов, особенно для компиляторов C++11. «Конструкция» и «уничтожение» должны работать немного лучше для распределителей C++11.
Избегайте разоблачения некоторых деталей. АДЛ на итераторах.
Следуйте стандарту, используя только методы построения и уничтожения распределителей для создания и уничтожения сохраненных элементов. Не используйте их для внутренних данных, таких как указатели.
Исправьте некоторые затененные переменные предупреждения#9377.
Исправьте использование распределителя в документации#9719.
Всегда используйте простое число ведер для целых чисел. Исправляет регрессию производительности при вставке последовательных целых чисел, хотя делает другие применения медленнее#9282.
Только конструировать элементы с помощью распределителей, как указано в стандарте C++11.
Упрощенная реализация задания, фиксирует исключение проблемы безопасности для<unordered_multiset>и<unordered_multimap>. Может быть немного медленнее.
Прекратите использовать возвратное значение SFINAE, с которым у некоторых старых компиляторов есть проблемы.
Статья Change Log раздела The Boost C++ Libraries BoostBook Documentation Subset Chapter 41. Boost.Unordered может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.