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

Boost.MultiIndex Documentation - Examples

Boost , , Boost.MultiIndex Documentation - Index

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

Boost.MultiIndex Examples



Contents

Example 1: basic usage

См.исходный код.

Базовая программа, показывающая многоиндексные возможности Boost. МультиИндекс с откровенно скучным набором<employee>записей.

Example 2: using functions as keys

См.исходный код.

Обычно ключи, присвоенные индексу, основаны на переменной элемента, но могут быть определены ключевые экстракторы, которые берут свое значение из функции члена или глобальной функции. Это имеет некоторое сходство с концепциейвычисленных ключей, поддерживаемой некоторыми реляционными движками баз данных. Пример показывает, как использовать предопределенные<const_mem_fun>и<global_fun>ключевые экстракторы для решения этой ситуации.

Ключи, основанные на функциях, обычно не являются фактическими ссылками, а скорее временными значениями, возникающими в результате вызова используемой функции-члена. Это означает, что<modify_key>не может быть применено к этому типу экстракторов, что в любом случае является совершенно логическим ограничением.

Example 3: constructing multi_index_containers with ctor_args_list

См.исходный код.

Мы показываем практический пример использования<multi_index_container::ctor_arg_list>, определение и цель которого объяснены вучебнике. Программа группирует отсортированный набор чисел, основанный на идентификации через арифметику модуля, с помощью которой<x>и<y>эквивалентны, если<(x%n)==(y%n)>, для некоторых фиксированных<n>.

Example 4: bidirectional map

См.исходный код.

Этот пример показывает, как построить двунаправленную карту<multi_index_container>. Поддвунаправленной картоймы подразумеваем контейнер из<(const FromType,const ToType)>пар, так что не существует двух элементов с одним и тем же первымиливторым компонентом<std::map>только гарантирует уникальность первого компонента. Для обоих ключей предусмотрен быстрый поиск. В программе есть крошечный испанско-английский словарь с онлайн-запросом слов на обоих языках.

Эта двунаправленная карта может рассматриваться как примитивный предшественник полноценного контейнера, предоставленногоBoost.Bimap.

Example 5: sequenced indices

См.исходный код.

Сочетание секвенированного индекса с индексом типа<ordered_non_unique>дает<list>-подобную структуру с возможностями быстрого поиска. Пример выполняет некоторые операции над данным текстом, такие как подсчет слов и выборочное удаление некоторых слов.

Example 6: complex searches and foreign keys

См.исходный код.

Эта программа иллюстрирует некоторые передовые методы, которые могут быть применены для сложных структур данных с использованием<multi_index_container>. Рассмотрим класс<car_model>для хранения информации об автомобилях. При первом подходе<car_model>можно определить как:

struct car_model
{
  std::string model;
  std::string manufacturer;
  int         price;
};

Это определение имеет недостаток дизайна, который любой читатель, знакомый с реляционными базами данных, может легко обнаружить: Модель<manufacturer>дублируется среди всех автомобилей, имеющих одного производителя. Это пустая трата пространства и создает трудности, когда, например, название производителя должно быть изменено. Следуя обычным принципам проектирования реляционных баз данных, соответствующий дизайн включает в себя хранение изделий в отдельном<multi_index_container>и указание на них в<car_model>:

struct car_manufacturer
{
  std::string name;
};
struct car_model
{
  std::string       model;
  car_manufacturer* manufacturer;
  int               price;
};

Несмотря на предопределенный рост. Экстракторы ключей MultiIndex могут обрабатывать множество ситуаций, связанных с указателями (см.расширенные функции Boost). Ключевой экстрактор MultiIndexв учебнике достаточно сложен, чтобы определить подходящий ключ-экстрактор. Следующие полезные каскады двух ключевых экстракторов:

template<class KeyExtractor1,class KeyExtractor2>
struct key_from_key
{
public:
  typedef typename KeyExtractor1::result_type result_type;
  key_from_key(
    const KeyExtractor1& key1_=KeyExtractor1(),
    const KeyExtractor2& key2_=KeyExtractor2()):
    key1(key1_),key2(key2_)
  {}
  template<typename Arg>
  result_type operator()(Arg& arg)const
  {
    return key1(key2(arg));
  }
private:
  KeyExtractor1 key1;
  KeyExtractor2 key2;
};

Для того, чтобы получить доступ из<car_model>в<name>поле его ассоциированного<car_manufacturer>может быть выполнен с

key_from_key<
  member<car_manufacturer,const std::string,&car_manufacturer::name>,
  member<car_model,const car_manufacturer *,car_model::manufacturer>
>

Программа запрашивает у пользователя автопроизводителя и диапазон цен и возвращает автомодели, удовлетворяющие этим требованиям. Это сложный поиск, который не может быть выполнен на одной операции. В общих чертах, одна процедура для выполнения выбора:

  1. Выберите элементы с данным производителем с помощью<equal_range>,
  2. подавайте эти элементы в<multi_index_container>, отсортированные по цене,
  3. выберите по цене с использованием<lower_bound>и<upper_bound>;
или альтернативно:
  1. Выберите элементы в ценовом диапазоне с<lower_bound>и<upper_bound>,
  2. подавайте эти элементы в<multi_index_container>, отсортированный производителем,
  3. найдите элементы с данным производителем с использованием<equal_range>.
Интересная техника, разработанная на примере, заключается в построении промежуточного<multi_index_container>. Чтобы избежать копирования объектов, соответствующиевидыопределяются с<multi_index_container>s, имеющими в качестве элементов указатели на<car_model>s вместо фактических объектов. Эти точки зрения должны быть дополнены соответствующими выжимателями ключей отмены ссылок.

Example 7: composite keys

См.исходный код.

Конструкция Boost.MultiIndex<composite_key>предоставляет гибкий инструмент для создания индексов с нетривиальными критериями сортировки. Программа имеет рудиментарное моделирование файловой системы вместе с интерактивной Unix-подобной оболочкой. Ввод файла представлен следующей структурой:

struct file_entry
{
  std::string       name;
  unsigned          size;
  bool              is_dir; // true if the entry is a directory
  const file_entry* dir;    // directory this entry belongs in
};

Записи хранятся в<multi_index_container>с двумя индексами с композитными ключами:

  • Первичный индекс, упорядоченный по каталогу и имени,
  • .. . . . . . . . . . . . . . . . . . . .
Причина, по которой порядок выполняется в первую очередь каталогом, в котором расположены файлы, подчиняется локальному характеру команд оболочки, как, например,<ls>. Моделирование оболочки имеет только три команды:
  • < [26] >
  • < [28] >< [29] >[ударная стойка]
  • < [32] >
Программа выходит, когда пользователь нажимает клавишу Enter в командной строке.первичный индекс, упорядоченный по каталогу и имени,
  • Вторичный индекс, упорядоченный по каталогу и размеру.
  • The reason that the order is made firstly by the directory in which the files are located obeys to the local nature of the shell commands, like for instance ls. The shell simulation only has three commands:
    • cd [.|..|<directory>]
    • ls [-s]-sзаказывает выход по размеру
    • mkdir<directory>
    The program exits when the user presses the Enter key at the command prompt. [ORIG_END] -->

    Читателю предлагается добавить больше функциональности в программу, например:

    • В ПРМД ПРЕСС-ПРЕСС, Н< [38] >.
    • Добавленная писсуарная справка.
    • Истержневойстержневойстержневойстержневойстержневой].
    Внедрение дополнительных команд, таких какcp.
  • Добавьте обработку абсолютных путей.
  • Используйтесериализациюдля хранения и извлечения состояния файловой системы между запусками программы.
  • [ORIG_END] -->

    Example 8: hashed indices

    См.исходный код.

    Хешированные индексы могут использоваться в качестве альтернативы упорядоченным индексам, когда требуется быстрый поиск и сортировка информации не представляет интереса. Пример имеет счетчик слов, где дублирующие записи проверяются с помощью хешированного индекса. Сравните алгоритм подсчета слов с алгоритмомпримера 5.

    Example 9: serialization and MRU lists

    См.исходный код.

    Типичное применение возможностей сериализации позволяет программе восстанавливать пользовательский контекст между исполнениями. Примерная программа запрашивает у пользователя слова и ведет учет десяти последних введенных, в текущей или в предыдущих сессиях. Серийизованная структура данных, иногда называемаяMRU (самый недавно используемый) список, имеет некоторый интерес сама по себе: список MRU ведет себя как обычная очередь FIFO, за исключением того, что при вставке предсуществующей записи это не появляется дважды, но вместо этого запись перемещается в переднюю часть списка. Вы можете наблюдать это поведение во многих программах с командой меню «Недавние файлы». Эта структура данных реализована с помощью<multi_index_container>путем объединения секвенированного индекса и индекса типа<hashed_unique>.

    Example 10: random access indices

    См.исходный код.

    Пример возобновляет текстовый контейнер, введенный впримере 5, и показывает, как замена индекса случайного доступа секвенированным индексом обеспечивает дополнительные возможности, такие как эффективный доступ по положению и расчет смещения данного элемента в контейнер.

    Example 11: index rearrangement

    См.исходный код.

    Существует относительно распространенное городское предание, утверждающее, что колода карт должна быть перетасована семь раз подряд, чтобы быть идеально смешанной. Заявление вытекает из работ математика Перси Диакониса оперетасовке риффлей: Эта техника перетасовки включает в себя разделение колоды на два пакета примерно одинакового размера, а затем удаление карт из обоих пакетов, чтобы они стали переплетенными. Было показано, что при повторении этой процедуры в семь раз статистическое распределение карт достаточно близко к тому, которое связано с действительно случайной перестановкой. Меру «случайности» можно оценить, посчитаввосходящие последовательности: Рассмотрим перестановку последовательности 1,2, ...,n, восходящая последовательность представляет собой максимальную цепь последовательных элементовм,м+1, ...,м+р, так что они расположены в порядке возрастания. Например, перестановка 125364789 состоит из двух восходящих последовательностей 1234 и 56789, что становится очевидным при отображении такой последовательности125364789. Среднее число восходящих последовательностей в случайной перестановкеnэлементов составляетn+1/2: напротив, после одной рифлевой перетасовки первоначально сортированной колоды карт не может быть более двух восходящих последовательностей. Среднее число восходящих последовательностей приближается кn+1/2 по мере увеличения числа последовательных риффлевых перетасовок, при этом семь перетасовок дают близкий результат для колоды покера с 52 картами. Бумага Брэда Манна«Сколько раз вы должны перетасовать колоду карт?»обеспечивает строгий, но очень доступный подход к этому вопросу.

    Примерная программа оценивает среднее число восходящих последовательностей в колоде из 52 карт после повторного перетасовки риффлей, а также применения совершенно случайной перестановки. Палуба смоделирована следующим контейнером:

    <
    multi_index_container<
     int,
     indexed_by<
       random_access<>,
       random_access<>
     >
    >
    
    >
    , где первый индекс сохраняет текущее расположение палубы, а второй индекс используется для запоминания стартового положения. Это представление позволяет эффективно реализовать алгоритм подсчета восходящих последовательностей в линейном времени.<rearrange>используется для нанесения на палубу перетасовки, выполняемой внешне на вспомогательной структуре данных.

    Example 12: using Boost.Interprocess allocators

    См.исходный код.

    Повышаю. MultiIndex поддерживает специальные распределители, такие как те, которые предоставляютсяBoost.Interprocess, который позволяет размещать<multi_index_container>s в общей памяти. В примере показана передняя часть небольшой базы данных книг, реализованная с помощью<multi_index_container>, хранящейся в бусте. Межпроцессная память картографированного файла. Читатель может проверить, что несколько экземпляров программы работают правильно одновременно и сразу увидеть изменения в базе данных, выполненные любым другим экземпляром.




    Пересмотрено 26 мая 2009

    © Copyright 2003-2009 Joaquín M López Muñoz. Распространяется под лицензией Boost Software License, версия 1.0. (См. сопроводительный файлLICENSE_1_0.txtили копию на) http://www.boost.org/LICENSE_1_0.txt

    Статья Boost.MultiIndex Documentation - Examples раздела Boost.MultiIndex Documentation - Index может быть полезна для разработчиков на c++ и boost.




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



    :: Главная :: Boost.MultiIndex Documentation - Index ::


    реклама


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

    Время компиляции файла: 2024-08-30 11:47:00
    2025-05-19 20:08:23/0.010193109512329/0