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

Differences with standard maps

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

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

bimap<int,std::string> bm;
bm.left.insert(1,"orange");
bm.left.insert(2,"orange"); // No effect! returns make_pair(iter,false)

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

bimap<int, multiset_of<std::string> > bm;
bm.left.insert(1,"orange");
bm.left.insert(2,"orange"); // Insertion succeed!

Если мы используем пользовательский набор типов отношений, вставка также должна быть разрешена.

Соотношения, хранящиеся в Бимапе, не будут в большинстве случаев модифицироваться непосредственно итераторами, поскольку обе стороны используются в качестве ключейна основе ключей. Когда<bimap<A,B>>левый итератор просмотра отменяется, тип возвратасовместим с подписьюс<std::pair<constA,constB>>. Однако есть некоторые типы коллекций, которые не основаны наkey_based., например, список. Если Bimap использует один из этих типов сбора данных, нет никаких проблем с изменением данных этой стороны. Действителен следующий код:

typedef bimap< int, list_of< std::string > > bm_type;
bm_type bm;
bm.insert( bm_type::relation( 1, "one" ) );
...
bm.left.find(1)->second = "1"; // Valid

В этом случае, когда итератор отменяется, тип возвратаподпись-совместимас<std::pair<constint,std::string>>.

В нижеследующей таблице показана последовательность данных каждого типа сбора:

Тип боковой коллекции

Исключенные данные

<set_of>

constant

<multiset_of>

constant

unordered_set_of

constant

<unordered_multiset_of>

constant

list_of

изменчивый

<vector_of>

изменчивый

unconstrained_set_of

изменчивый

Вот несколько примеров. При отмене итераторов возвращается тип, который являетсясигнатурой-совместимымс этими типами.

Тип Бимапа

Типы, совместимые с подписью

bimap<A,B>

iterator -> relation<const A,const B>

left_iterator -> pair<const A,const B>

right_iterator-> pair<const B,const A>

bimap<multiset_of<A>,unordered_set_of<B> >

iterator -> relation<const A,const B>

left_iterator -> pair<const A,const B>

right_iterator-> pair<const B,const A>

<bimap<set_of<A>,list_of<B> >>

iterator -> relation<const A,B>

left_iterator -> pair<const A,B>

right_iterator-> pair<B,const A>

<bimap<vector_of<A>,set_of<B> >>

<iterator>-><relation<A,const B>>

<left_iterator>-><pair<A,const B>>

<right_iterator>-><pair<const B,A>>

bimap<list_of<A>,unconstrained_set_of<B> >

iterator -> relation<A,B>

left_iterator -> pair<A,B>

right_iterator-> pair<B,A>

<set_of>и<unordered_set_of>карты просматривают перегрузку<operator[]>для извлечения связанных данных заданного ключа только тогда, когда другой тип сбора является изменчивым. В этих случаях он работает так же, как и стандарт.

bimap< unorderd_set_of< std::string>, list_of<int> > bm;
bm.left["one"] = 1; // Ok

Стандарт определяет функцию доступа для<map>и<unordered_map>:

const data_type & at(const key_type & k) const;
      data_type & at(const key_type & k);

Эти функции ищут ключ и возвращают связанное значение данных, но бросают исключение<std::out_of_range>, если ключ не найден.

В бимапах константная версия этих функций приведена для<set_of>и<unorderd_set_of>видов карт независимо от другого типа коллекции. Изменяемая версия предоставляется только тогда, когда другой тип коллекции является изменяемым.

The following examples shows the behaviour of at(key)

Go to source code

typedef bimap< set_of< std::string >, list_of< int > > bm_type;
bm_type bm;
try
{
    bm.left.at("one") = 1; // throws std::out_of_range
}
catch( std::out_of_range & e ) {}
assert( bm.empty() );
bm.left["one"] = 1; // Ok
assert( bm.left.at("one") == 1 ); // Ok

typedef bimap< multiset_of<std::string>, unordered_set_of<int> > bm_type;
bm_type bm;
bm.right[1] = "one"; // compilation error
bm.right.insert( bm_type::right_value_type(1,"one") );
assert( bm.right.at(1) == "one" ); // Ok
try
{
    std::cout << bm.right.at(2); // throws std::out_of_range
}
catch( std::out_of_range & e ) {}
bm.right.at(1) = "1"; // compilation error

Сложность некоторых операций различна в бимапах. Прочитайтессылку, чтобы найти сложность каждой функции.


PrevUpHomeNext

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




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



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


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 19:01:15/0.036324024200439/1