![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
One minute tutorialBoost , Chapter 1. Boost.Bimap , Chapter 1. Boost.Bimap
|
Тип< | |
< | |
<bm.right
>работает как<std::map<
std::string,int>
>. Важно отметить, что ключ — это первый тип, а данные — второй, как и в стандартных картах.
bm_type::right_const_iterator right_iter = bm.right.find("two"); // right_iter->first : key : std::string // right_iter->second : data : int assert( right_iter->second == 2 ); assert( bm.right.at("one") == 1 ); bm.right.erase("two");bm.right.insert( bm_type::right_value_type( "four", 4 ) );
Основное различие между представлениями бимапа и их аналогами в стандартных контейнерах заключается в том, что из-за двунаправленного характера бимапа значения, хранящиеся в нем, не могут быть изменены непосредственно с помощью итераторов. Например, когда<std::map<X,Y>
>итератор удален, тип возврата<std::pair<constX,
Y>
>, поэтому действителен следующий код:<m.begin()->second=new_value;
>. Однако отсылка к<bimap<X,Y>::left_iterator
>возвращает тип, которыйсовместим с подписьюс<std::pair<constX,constY>
>.
bm.left.find(1)->second = "1"; // Compilation error
Если вы вставите<(1,"one")
>и<(1,"1")
>в<std::map<int,std::string>
>, вторая вставка не будет иметь никакого эффекта. В<bimap<X,Y>
>оба ключа должны оставаться уникальными. Вставка также может потерпеть неудачу в других ситуациях. Давайте посмотрим пример
bm.clear(); bm.insert( bm_type::value_type( 1, "one" ) ); bm.insert( bm_type::value_type( 1, "1" ) ); // No effect! bm.insert( bm_type::value_type( 2, "one" ) ); // No effect! assert( bm.size() == 1 );
Посмотрите, как вы можете повторно использовать код, который предназначен для использования с std::maps, как функция print_map в этом примере.
#include <string> #include <iostream> #include <boost/bimap.hpp> template< class MapType > void print_map(const MapType & map, const std::string & separator, std::ostream & os ) { typedef typename MapType::const_iterator const_iterator; for( const_iterator i = map.begin(), iend = map.end(); i != iend; ++i ) { os << i->first << separator << i->second << std::endl; } } int main() { // Soccer World cup typedef boost::bimap< std::string, int > results_bimap; typedef results_bimap::value_type position; results_bimap results; results.insert( position("Argentina" ,1) ); results.insert( position("Spain" ,2) ); results.insert( position("Germany" ,3) ); results.insert( position("France" ,4) ); std::cout << "The number of countries is " << results.size() << std::endl; std::cout << "The winner is " << results.right.at(1) << std::endl << std::endl; std::cout << "Countries names ordered by their final position:" << std::endl; // results.right works like a std::map< int, std::string > print_map( results.right, ") ", std::cout ); std::cout << std::endl << "Countries names ordered alphabetically along with" "their final position:" << std::endl; // results.left works like a std::map< std::string, int > print_map( results.left, " ends in position ", std::cout ); return 0; }
Результатом этой программы будет следующее:
The number of countries is 4
The winner is Argentina
Countries names ordered by their final position:
1) Argentina
2) Spain
3) Germany
4) France
Countries names ordered alphabetically along with their final position:
Argentina ends in position 1
France ends in position 4
Germany ends in position 3
Spain ends in position 2
Информацию о подписях функций см. в любой стандартной библиотечной документации или в разделессылкиэтой документации.
![]() | Caution |
---|---|
Имейте в виду, что двунаправленная карта совместима только со стандартными контейнерами. Некоторые функции могут давать разные результаты, например, в случае вставки пары в левую карту, где второе значение конфликтует с сохраненным отношением в контейнере. Функции могут быть медленнее в бимапе из-за дублированных ограничений. Настоятельно рекомендуется читать. Полное руководство, если вы намерены использовать бимап в серьезном проекте. |
<Y
>Тип являетсясигнатурно-совместимымс другим типом, если он имеет такую же сигнатуру для функций и метаданных. Предпосылки, условия и порядок операций не обязательно должны быть одинаковыми.
Статья One minute tutorial раздела Chapter 1. Boost.Bimap Chapter 1. Boost.Bimap может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 1. Boost.Bimap ::
реклама |