boost中bimap雙向對映的初級學習

2021-09-25 11:44:57 字數 3813 閱讀 3159

boost的bimap相當於stl的map的公升級版本, 具有雙向對映. 學過stl的map的童鞋很容易掌握它的使用.

不過, 差別肯定是有的. 因為它是雙向的, 所以有左右之分. 如:

boost::bimapbm;

bm.left就相當於stl的map, bm.right就是把stl中的key-value鍵值對反過來, 變成value-key, 它相應的

first和second也就變成了value和key.

舉例說明, 假我們要做乙個**簿, 有區號-城市的對應關係, 有時候我們有區號, 想得到城市, 或是有城市

想得到區號, 我們可能需要這樣乙個雙向對映關係的**簿, 我們可以這樣: 1

typedef boost::bimap

<

std::

string

,std::

string

>

bm_type;

2typedef bm_type::value_type position;

3bm_type bmphone;

4bmphone.insert( position( 

"0771", 

"南寧") );5

這樣, bmphone裡就插入了乙個 "0771"-"南寧"的項.( 鄙人是廣西人, 偏愛廣西, 各位不要介意哈 ).

這裡要注意的是, 在插入的時候, 使用的是 bm_type::value_type, 而不是stl的make_pair, 這一點是值

得注意的. 另一點就是, 如果插入 position( "0772", "南寧" )是會失敗的, 會產生乙個編譯錯誤( 這可比

執行時失敗要好得多辣 ), 因為bimap也是乙個map, 不允許有重複鍵, 因為它是雙向的, 右邊的value也是

乙個鍵值, 所以插入兩個"南寧"是會失敗的. 可能您會說, stl有multimap支援複製值的啊, bimap也是支援

的, 我們待會兒再說.

假設我們要通過乙個區號去查詢城市, 如有介面: std::string getcitybycode( std::string strcode ); 那麼我們

可以實現如下: 1

std::

string

getcitybycode( std::

string

strcode )2

如果我們要通過城市查區號, 那就把left換成right就成了.

貼出完整源**:

: 定義控制台應用程式的入口點。

//#include 

"stdafx.h

"#include 

<

iostream

>

#include 

<

boost

/bimap.hpp

>

class

phonemanager 

void

init( 

void

);void

listall( 

void

) const

;std::

string

getcitybyareacode( std::

string

strareacode ) 

const

;std::

string

getareacodebycity( std::

string

strcity ) 

const

;private

:typedef boost::bimap

<

std::

string

,std::

string

>

bm_type;

typedef bm_type::left_const_iterator left_const_iterator;

typedef bm_type::right_const_iterator right_const_iterator;

bm_type _bmvalues;

};int

_tmain(

intargc, _tchar

*ar**)

void

phonemanager::init( 

void

)std::

string

phonemanager::getareacodebycity( std::

string

strcity ) 

const

std::

string

phonemanager::getcitybyareacode( std::

string

strareacode ) 

const

void

phonemanager::listall( 

void

) const}

有時候, 我們覺得 it->first, it->second看起來很彆扭,  讓人覺得迷惑, 不知道 first和 second是啥, 這個時候, 我們可以使用標籤功能.

1typedef boost::bimap

<

2tagged

<

std::

string

, areacode

>

,  //

在這裡加標籤

3tagged

<

std::

string

, city    

>

4>

bm_type;

5typedef bm_type::value_type position;

6bm_type bmtest;

7bmtest.insert( position( 

"0771", 

"南寧") );

8for

( bm_type::map_by

<

areacode

>

::const_iterator 

//不用使用.left

9i  

=bmtest.by

<

areacode

>

().begin();  

//這裡也不必指定 .left

10i 

!=bmtest.by

<

areacode

>

().end( );

11++

i ) 17

最後, 要說一下關於重複鍵. boost裡沒有 multibimap, 但是我們可以充分利用模板的特性. 例子好說明:

拿例子來說, 每個身份證都對應乙個人的名字, 但人名是有重複的. 我們可以這樣做:

1#include 

<

boost

/bimap

/multiset_of.hpp

>23

typedef boost::bimap

<

4tagged

<

std::

string

,   id

>,5

multiset_of

<

tagged

<

std::

string

, name

>

>

//這裡使用multiset_of

6>

bm_type;

注意, 對映中預設都是排過序的, 如果不需要排序, 可以使用 unordered_set_of.

Hibernate對映關係(雙向)

hibernate雙向關係共3種 1對n n對1 1對1 多對多 例如 客戶訂單關係。乙個客戶有多個訂單,乙個訂單屬於乙個客戶。開發步驟 customer 類加上set訂單集合。order類新增customer屬性。customer.hbm.xml配置檔案one to many order.hbm....

boost中serialization模組的單體類

singleton.cpp 定義控制台應用程式的入口點。boost實現單體的兩種方式 1.通過boost的pool的singleton實現 2.通過boost的serialization的singleton實現,採用繼承或則定義乙個單體型別 而且serilization模組的單體類具備鎖功能。inc...

JPA 對映雙向多對多關聯關係

不維護關聯關係的一端 entity table name item public class item public void setid integer id public string getitemname public void setitemname string itemname pub...