Контейнеры STL спроектированы вокруг концепции, согласно которой каждый контейнер управляет собственным набором элементов, предоставляя доступ к ним способом, указанным типом контейнера: так, std::set поддерживает элементы, упорядоченные по заданному критерию сортировки, std::list позволяет свободно расположить элементы вдоль линейной последовательности и так далее.
Иногда возникает необходимость наличия различных интерфейсов доступа к одному и тому же базовому набору: например, некоторые данные могут быть отсортированы в соответствии с более чем одним предикатом сравнения, или двунаправленный список может извлечь выгоду из дополнительного логарифмического интерфейса поиска. В этих ситуациях программисты обычно прибегают к ручным композициям из разных контейнеров, решение, которое обычно включает в себя достаточное количество кода, предназначенного для сохранения синхронизации различных частей композиции. Повышаю. MultiIndex допускает спецификацию multi_index_containers, состоящего из одного или более индексов с различными интерфейсами к одному и тому же набору элементов. Полученные конструкции концептуально чище, чем ручные композиции, и часто работают намного лучше. Было принято важное дизайнерское решение о том, что индексы заданного multi_index_container задаются во время компиляции: это дает достаточно места для статической проверки типа и оптимизации кода.
Повышаю. MultiIndex черпает вдохновение из основных концепций индексации, возникающих в теории реляционных баз данных, хотя он не предназначен для обеспечения полноценной реляционной базы данных. multi_index_container легко интегрируется в дизайн STL-контейнера/алгоритма и обладает некоторыми дополнительными возможностями в отношении операций поиска и обновления элементов, которые являются полезными расширениями даже для одноиндексированных контейнеров.
Fig. 1: Diagram of a multi_index_container with three indices.
На рисунке выше изображен multi_index_container, состоящий из трех индексов: первые два представляют собой набороподобный интерфейс для элементов, отсортированных по форме и идентификатору, соответственно, в то время как последний индекс обеспечивает функциональность двунаправленного списка в духе std::list. Эти индексы действуют как «просмотры» для внутреннего набора элементов, но они не только обеспечивают доступ к набору для чтения: методы вставки / удаления также реализованы так же, как и методы std::sets или std::lists. Включение элемента через один данный индекс будет успешным только в том случае, если будут выполнены ограничения уникальности всех индексов.
Все публичные виды бустов. MultiIndex находится в пространстве имен ::boost::multi_index. Кроме того, основной шаблон класса multi_index_container и глобальные функции get и project поднимаются до пространства имен ::boost с помощью объявлений using. Для краткости изложения фрагменты кода в документации пишутся так, как если бы действовали следующие декларации:
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.