Эффективность поисковых операций улучшилась в ситуациях, когда они включают генерацию временных значений<key_type>. Рассмотрим, например, следующий код:
<
typedefmulti_index_container<std::string,indexed_by<ordered_unique<identity<std::string>>>>multi_t;...multi_tm=...;m.find("boost");// passed a const char*, not a std::string
>
В предыдущих версиях библиотеки операция<find>генерирует несколько временных<std::string>с (по одному при каждом внутреннем сравнении). В достаточно продвинутых компиляторах этого теперь избегают, чтобы создавался только один временный.
Когда доступны<std::tuple>s, они могут использоваться для операций поиска в индексах, оснащенных составными ключами.<boost::tuple>также поддерживают обратную совместимость.
Функция элемента хешированных индексов<erase(iterator)>раньше имела плохую производительность в условиях низкой нагрузки из-за требования возврата итератора к следующему элементу (см. билетNo 4264). В соответствии с решениемпроблемы LWG No579, эта проблема была исправлена при сохранении интерфейса<erase>, за счет использования еще одного слова памяти на элемент. Фактически, требования сложности C++ к неупорядоченным ассоциативным контейнерам были улучшены для хешированных индексов так, что
удаление данного элемента является безусловно постоянным временем,
в худшем случае производительность не<O(n)>, а<O(ndist)>, где<ndist>является числом неэквивалентных элементов в индексе.
В связи с тем, что хешированные индексы опираются на новую структуру данных, внутреннее представление их итераторов и локальных итераторов изменилось, что влияет на сериализацию: их соответствующая сериализацияклассной версиибыла увеличена с 0 до 1. Старые архивы с хешированными индексными (местными) итераторами могут быть загружены версией Boost 1.56. MultiIndex, но не наоборот.
Индексы хеширования теперь обеспечивают<reserve>.
Индексы хэширования теперь можно проверить на равенство и неравенство в соответствии со стандартной спецификацией C++[unord.req]
. Публичный интерфейс Boost. MultiIndex предоставляет<noexcept>спецификации в соответствующих случаях (для компиляторов).
Поддерживаются некопируемые элементы (такие как<std::unique_ptr<T>>). Это включает в себя вставку диапазона<first>,<last>, где итераторы указывают на тип, который преобразуется в тип элемента: в процессе не происходит копирование конструкции.
Индексы случайного доступа обеспечивают<shrink_to_fit()>.
Сериализация теперь использует портативный<collection_size_type>тип вместо оригинального<std::size_t>(билет#3365).<multi_index_container>сериализацияверсия классабыла увеличена с 0 до 1.
В предыдущих версиях библиотеки функцииэлемента обновленияхешированных индексов могут изменять положение элемента, даже если соответствующий ключ не изменяется с обновлением. Это законное, но, вероятно, неожиданное поведение. Функции были переписаны, чтобы обеспечить дополнительную гарантию того, что элементы с немодифицированным ключом не изменят позицию в хешированных индексах, как это всегда было в случае с упорядоченными индексами. Эти гарантии теперь задокументированы в ссылке.
Добавлен конструктор<multi_index_container::multi_index_container(const allocator_type&)>для имитации эквивалентного интерфейса в контейнерах последовательностей STL.
Новые версии<modify>и<modify_key>с откатом, как описано вучебнике
.
Индексы обеспечивают новые функции<cbegin>,<cend>и, когда это применимо,<crbegin>и<crend>в соответствии с последними проектами следующего пересмотра стандарта C++.
Намеченная вставка в упорядоченные индексы полностью соответствует разрешениям стандартной библиотеки C++Defect Report 233. Новое требование о том, чтобы точка вставки всегда была как можно ближе к намеку, вызывает иное поведение, чем проявлялось в предыдущих выпусках Boost. MultiIndex, который потенциально может вызвать проблемы обратной совместимости; в любом случае вероятность возникновения этих проблем совместимости в реальном сценарии очень низка.
Индексы последовательного и случайного доступа теперь соответствуют требованиям стандарта C++ для контейнеров последовательностей в отношении операций<assign(f,l)>и<insert(p,f,l)>(23.1.1/9): если<f>и<l>имеют один и тот же интегральный тип, избегают перегрузок на основе итератора этих функций-членов:
<
typedefmulti_index_container<int,indexed_by<sequenced<>>>sequenced_container;std::list<int>l(...);sequenced_containerc;// iterator-based overload of assignc.assign(l.begin(),l.end());// The following is equivalent to
// c.assign(
// static_cast<sequenced_container::size_type>(10),100);
// that is, "10" and "100" are not taken to be iterators as
// in the previous expression.c.assign(10,100);
Все предопределенные повышения. Ключевые экстракторы MultiIndex, инстанцированные для данного типа<T>, могут обрабатывать объекты типов, полученных из<T>или конвертируемых в<T>(ицепных указателейк ним). Ранее принимались только объекты точно указанного типа (наряду с<reference_wrapper>с и прикованными к ним указателями).
<composite_key_compare>и связанные с ними классы принимают операнды, не включенные в кортежи, как если бы они были переданы в кортеж длиной 1; это позволяет пользователю опустить кортеж, заключенный в операции поиска с использованием композитных ключей, когда предоставляется только первый ключ.
Были оптимизированы основные алгоритмы упорядоченных индексов, что позволило сократить время вставки примерно на 5%.
Размер заголовков узлов упорядоченных индексов на большинстве платформ снижен на 25%, с использованием хорошо известнойтехники оптимизации.
Учебник был реструктурирован, добавлены новые примеры.
Для упорядоченных и хешированных индексов<erase(it)>и<erase(first,last)>теперь возвращают итератор к элементу после удаляемых (ранее ничего не возвращалось) в соответствии с C++. Стандартная библиотекаОтчет о дефектах 130и выпуск 6.19 TR1Список проблем.
Повышение. MultiIndex предлагает обычные гарантии в отношении многопоточного кода, предоставляемые большинством реализаций STL:
Одновременный доступ к различным контейнерам безопасен.
Доступ к одному и тому же контейнеру безопасен.
В предыдущих версиях библиотеки последняя гарантия не поддерживалась должным образом, если был установлен безопасный режим. Сейчас эта проблема решена.
Добавленыхешированные индексы, интерфейс которых основан на спецификации для неупорядоченных ассоциативных контейнеров в стандартном библиотечном техническом отчете C++ (TR1).
Уничтожение мемфунов<multi_index_container>и<clear>теперь происходит быстрее.
Внутренние изменения, направленные на уменьшение длины имен символов, генерируемых компилятором; порезы до 50% могут быть достигнуты в отношении выпуска Boost 1.32. Это приводит к гораздо более коротким и читаемым сообщениям об ошибках, а также оказывает благотворное влияние на компиляторы со строгими ограничениями длины имен символов. Кроме того, добавлен раздел о дальнейшемуменьшении длины имени символа.
Реструктуризация некоторых частей документации, новые примеры.
Статья Boost.MultiIndex Documentation - Release notes раздела Boost.MultiIndex Documentation - Index может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.