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

Additional information

Boost , Chapter 1. Boost.Bimap , The tutorial

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

Двунаправленные карты могут иметь соответствующую информацию о каждом соотношении. Предположим, мы хотим представить книги и двунаправленную карту автора.

typedef bimap<
    multiset_of< std::string >, // author
         set_of< std::string >  // title
> bm_type;
typedef bm_type::value_type book;
bm_type bm;
bm.insert( book( "Bjarne Stroustrup"   , "The C++ Programming Language" ) );
bm.insert( book( "Scott Meyers"        , "Effective C++"                ) );
bm.insert( book( "Andrei Alexandrescu" , "Modern C++ Design"            ) );
// Print the author of Modern C++
std::cout << bm.right.at( "Modern C++ Design" );

Предположим теперь, что мы хотим сохранить абстракцию каждой книги. У нас есть два варианта:

  1. Названия книг являются уникальными идентификаторами, поэтому мы можем создать отдельный<std::map<string,string>>, который связывает названия книг с рефератами.
  2. Можно использоватьBoost.MultiIndexдля нового зверя.

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

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

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

Повышаю. Bimap обеспечивает поддержку такого рода ситуаций с помощью встроенного информационного элемента. Вы можете передать дополнительный параметр бимапу:<with_info< InfoType>>и<info>элемент типа<InfoType>появится в соотношении и парах бимапа.

relation.and.pair.with.info

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

typedef bimap<
    multiset_of< std::string >, // author
         set_of< std::string >, // title
      with_info< std::string >  // abstract
> bm_type;
typedef bm_type::value_type book;
bm_type bm;
bm.insert(
    book( "Bjarne Stroustrup"   , "The C++ Programming Language",
          "For C++ old-timers, the first edition of this book is"
          "the one that started it all—the font of our knowledge." )
);
// Print the author of the bible
std::cout << bm.right.at("The C++ Programming Language");
// Print the abstract of this book
bm_type::left_iterator i = bm.left.find("Bjarne Stroustrup");
std::cout << i->info;

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

i->info += "More details about this book";

Новая функция включена вуникальныйвид карты:<info_at(key)>, который имитирует стандартную<at(key)>функцию, но возвращает связанную информацию вместо данных.

// Print the new abstract
std::cout << bm.right.info_at("The C++ Programming Language");

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

typedef bimap<
    multiset_of< tagged< std::string, author   > >,
         set_of< tagged< std::string, title    > >,
      with_info< tagged< std::string, abstract > >
> bm_type;
typedef bm_type::value_type book;
bm_type bm;
bm.insert(
    book( "Bjarne Stroustrup"   , "The C++ Programming Language",
          "For C++ old-timers, the first edition of this book is"
          "the one that started it all—the font of our knowledge." )
);
// Print the author of the bible
std::cout << bm.by<title>().at("The C++ Programming Language");
// Print the abstract of this book
bm_type::map_by<author>::iterator i = bm.by<author>().find("Bjarne Stroustrup");
std::cout << i->get<abstract>();
// Contrary to the two key types, the information will be mutable
// using iterators.
i->get<abstract>() += "More details about this book";
// Print the new abstract
std::cout << bm.by<title>().info_at("The C++ Programming Language");

Перейти к исходному коду


PrevUpHomeNext

Статья Additional information раздела Chapter 1. Boost.Bimap The tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: The tutorial ::


реклама


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

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