![]() |
![]() ![]() ![]() ![]() |
![]() |
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 4The winner is ArgentinaCountries names ordered by their final position:1) Argentina2) Spain3) Germany4) FranceCountries names ordered alphabetically along with their final position:Argentina ends in position 1France ends in position 4Germany ends in position 3Spain ends in position 2
Информацию о подписях функций см. в любой стандартной библиотечной документации или в разделессылкиэтой документации.
![]() | Caution |
|---|---|
Имейте в виду, что двунаправленная карта совместима только со стандартными контейнерами. Некоторые функции могут давать разные результаты, например, в случае вставки пары в левую карту, где второе значение конфликтует с сохраненным отношением в контейнере. Функции могут быть медленнее в бимапе из-за дублированных ограничений. Настоятельно рекомендуется читать. Полное руководство, если вы намерены использовать бимап в серьезном проекте. |
<Y>Тип являетсясигнатурно-совместимымс другим типом, если он имеет такую же сигнатуру для функций и метаданных. Предпосылки, условия и порядок операций не обязательно должны быть одинаковыми.
Статья One minute tutorial раздела Chapter 1. Boost.Bimap Chapter 1. Boost.Bimap может быть полезна для разработчиков на c++ и boost.
:: Главная :: Chapter 1. Boost.Bimap ::
реклама |