1. 程式人生 > >STL Map使用詳解(一)(包含如何按關鍵字降序排列)

STL Map使用詳解(一)(包含如何按關鍵字降序排列)

 Map是一種關聯容器,用來儲存key-value資料。其中的key是用來查詢的關鍵字,value是實際存放的值。

一個特定的關鍵字只能與一個唯一的值相聯絡。map是由一對一對的鍵值(key/value)所組成的排序結構體,

鍵值是讀一無二的(unique)的。

  map通常是以平衡二叉查詢樹來實現的,因此map對插入,刪除,查詢能保證log(N)的時間複雜度。對於

海量的資料的插入和查詢,map是一個不錯的選擇。

  本文將對map的常見操作進行講解。不當之處,歡迎批評指正([email protected]).

  1. map的構造:

map提供了以下模板建構函式:

   template<class T1, class T2>

   map();                         // 預設建構函式

   map(const map& m)    // 拷貝建構函式

   map(iterator begin, iterator end );  //區間建構函式

   map(iterator begin, iterator end, const traits& _compare) //帶比較謂詞的建構函式

   map(iterator begin, iterator end, const traits& _compare, const allocator& all) //帶分配器

例子:

#include <map>

#include <iostream>

using namespace std; 

typedef pair<int,int> int_pair;

map<int,int>::iterator itr1;

map<int,int> m1; //預設升序,從小到大

m1[1] = 10; 

m1[2] = 20;

m1[3] = 30;

//輸出結果10 20 30,有換行

for (itr1 = m1.begin(); itr1 != m1.end(); ++itr1)

{

    cout << itr1->second << endl;

}

map<int,int,greater<int>> m2; //降序的map

map<int,int,greater<int>>::iterator itr2;

m2[1] = 10;  //插入鍵值為1,value為10的元素,multimap不支援operator[]

m2.insert(int_pair(2,20)); //map的valuetype是pair(t1,t2);

m2[3] = 30;

//輸出30,20,10

for (itr2 = m2.begin(); itr2 != m2.end(); ++itr2)

{

    cout << itr2->second << endl;

}

//利用m1的記憶體分配器構造一個m3

map<int,int>::allocator_type al = m1.get_allocator();

map<int,int> m3(less<int>(), al);

//根據m1拷貝一個m4

map<int,int> m4(m1); //謂詞和型別必須要匹配。

//根據兩個iterator構造map

map<int,int,greater<int>> m5(m2.begin(), m2.end());

//輸出m5, 30,20,10 ,帶換行。

for (itr2 = m5.begin(); itr2 != m5.end(); ++itr2)

{

    cout << itr2->second << endl;

}

以上程式碼需要VS2005以上編譯器。

2. map的常見操作: 

map支援常見的迭代器介面,例如begin(),end(),rbegin(),rend(). 

empty()        判斷map是否為空。為空的話返回真。

size()           返回map的長度

maxsize()    返回map能容納的最大的元素個數,根據編譯器和平臺而變化。

3. pair<iterator, bool> insert(iterator where,const value_type& val)

可以插入一個物件,一個物件的若干份拷貝,或者一個範圍內的物件.

insert函式把物件插入到where所指的元素之前。

示例程式碼:

map<int,int>::iterator itr1,itr2;

map<int,int> m1,m2;

typedef pair<int,int> int_pair;

m1.insert( int_pair( 1, 10) );

m1.insert( int_pair( 3, 30) );

由於map容器不允許鍵值重複,在執行插入操作後,可以根據返回值獲取操作是否成功。

返回值是一個迭代器和布林值的pair,迭代器指向map中具有該值的元素,布林值表示是否插入成功。

如果布林值為true,表示插入成功,則迭代器為新插入值在map中的位置。

如果布林值為false,表示插入失敗(已經存在該值),迭代器為原有值在map中的位置。

pair<map<int,int>::iterator, bool> insertresult;

insertresult = m1.insert(int_pair(1,10));

if (insertresult->second)

{

  //插入成功

}

else

{

  //插入失敗

}