C++中map的使用詳解說明

韓小妹發表於2018-08-08

一、定義  

    (1) map<string,   int>   Map; 
    (2) 或者是:typedef   map<string,int>   Mymap; 
                      Mymap   Map; 

二、插入資料 

插入資料之前先說一下pair 和 make_pair 的用法
pair是一個結構體,有first和second 兩個域,可以直接訪問

1 string key="sunquan";  
2 int value=123456;  
3 pair <string,int>  b(key, value);//這裡 pair <string,string>是資料型別,後面是調帶參構造方法  
4 cout<<b.first<<endl; 

而make_pair是返回一個pair <型別,型別>  的資料,eg:make_pair("asa",123456);   不過還得找個pair <string,int>型別的變數來接受返回值。
下面步入正題:

 

 (1) Map["abc"]=1;
 (2) Map.insert(pair<string,int>("c",3));
 (3)Map.insert(make_pair<string,int>("d",4)); 

三、修改和查詢資料

  (1)修改Map["sunquan"]=11111;

  (2)查詢資料 用Map.find(key); 可以通過鍵來查。

切記不要用int value=Map[key];這樣會在Map中增加這個key,而value就是預設值(int 為0,string為空字串)。

通過方法(2),會返回迭代器的地址,key不存在的話迭代器的值為Map.end();

四、刪除元素

(1)通過key刪除;

(2)通過迭代器來刪除;

下面看一下詳細的程式碼:

 

 1 #include <iostream>  
 2 #include <cstdio>  
 3 #include <cstring>  
 4 #include <string>  
 5 #include <map>  
 6 using namespace std;  
 7   
 8 int main()  
 9 {  
10     map<string,int> Map;  
11     map<string,int> ::iterator it;  
12     Map.insert(pair<string,int>("root",12));  
13     Map.insert(pair<string,int>("scot",11));  
14     for(it=Map.begin();it!=Map.end();it++)  
15         cout<<it->first<<"    "<<it->second<<endl;  
16     it=Map.begin();  
17     Map.erase(it);//通過迭代器刪除  
18     string key="root";  
19     Map.erase(key);//通過key刪除  
20       
21     Map.erase(Map.begin(),Map.end());//一個迭代器,到另一個迭代器  
22     //相當於  Map.clear();  
23   
24     for(it=Map.begin();it!=Map.end();it++)  
25         cout<<it->first<<"    "<<it->second<<endl;  
26     return 0;  
27 }  

 

注:

map<int, string>::iterator it 是宣告一個 迭代器
map<int, string> it 是 宣告一個map容器

 

五、c++中map的一些方法

    begin() 返回指向map頭部的迭代器
    clear() 刪除所有元素
    count() 返回指定元素出現的次數
    empty() 如果map為空則返回true
    end()   返回指向map末尾的迭代器

    equal_range()    返回特殊條目的迭代器對

    erase() 刪除一個元素
    find()  查詢一個元素
    insert()插入元素
    max_size()返回可以容納的最大元素個數
    size()  返回map中元素的個數
    swap()  交換兩個map

      get_allocator()  返回map的配置器
      key_comp()       返回比較元素key的函式
      lower_bound()    返回鍵值>=給定元素的第一個位置
      max_size()       返回可以容納的最大元素個數
      rbegin()         返回一個指向map尾部的逆向迭代器
      rend()           返回一個指向map頭部的逆向迭代器
      upper_bound()     返回鍵值>給定元素的第一個位置
      value_comp()      返回比較元素value的函式

專案需要,map的使用詳解來自部落格之家

鍵值對 匹配

1  標頭檔案 
  #include  <map>

2、map的功能

自動建立Key - value的對應。key 和 value可以是任意你需要的型別。 
根據key值快速查詢記錄,查詢的複雜度基本是Log(N),如果有1000個記錄,最多查詢10次,1,000,000個記錄,最多查詢20次。 
快速插入Key - Value 記錄。 
快速刪除記錄 
根據Key 修改value記錄。 
遍歷所有記錄。

3,

map的建構函式

map共提供了6個建構函式,這塊涉及到記憶體分配器這些東西,略過不表,在下面我們將接觸到一些map的構造方法,這裡要說下的就是,我們通常用如下方法構造一個map:

Map<int, string> mapStudent;

  定義 
  map<string,  int>  my_Map; 
  或者是typedef    map<string,  int>  MY_MAP; 
  MY_MAP  my_Map;

4, 插入資料 
  (1)  my_Map["a"]  =  1;


改變map中的條目非常簡單,因為map類已經對[]操作符進行了過載

enumMap[1] = "One";

enumMap[2] = "Two";

.....

這樣非常直觀,但存在一個效能的問題。插入2時,先在enumMap中查詢主鍵為2的項,沒發現,然後將一個新的物件插入enumMap,鍵是2,值是一個空字串,插入完成後,將字串賦為"Two"; 該方法會將每個值都賦為預設值,然後再賦為顯示的值,如果元素是類物件,則開銷比較大。我們可以用以下方法來避免開銷:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))


  (2)  my_Map.insert(map<string,  int>::value_type("b",2)); 
  (3)  my_Map.insert(pair<string,int>("c",3));

  (4)  my_Map.insert(make_pair<string,int>("d",4));


note : 如果相同元素放入到map中就是操作失敗,此處可應用於看看map中是否有此元素,插入判斷,防止程式碼實現功能錯誤

5.

查詢並獲取map中的元素

下標操作符給出了獲得一個值的最簡單方法:

CString tmp = enumMap[2];

但是,只有當map中有這個鍵的例項時才對,否則會自動插入一個例項,值為初始化值。

我們可以使用Find()和Count()方法來發現一個鍵是否存在。

查詢map中是否包含某個關鍵字條目用find()方法,傳入的引數是要查詢的key,在這裡需要提到的是begin()和end()兩個成員,分別代表map物件中第一個條目和最後一個條目,這兩個資料的型別是iterator.


int nFindKey = 2; //要查詢的Key

//定義一個條目變數(實際是指標)

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);

if(it == enumMap.end()) {

//沒找到

}

else {

//找到

}

6,  迭代資料 
  for  (my_Itr=my_Map.begin();  my_Itr!=my_Map.end();  ++my_Itr)  {}

7,map的大小 
在往map裡面插入了資料,我們怎麼知道當前已經插入了多少資料呢,可以用size函式,用法如下:

Int nSize = mapStudent.size();

8,,資料的清空與判空

清空map中的資料可以用clear()函式,判定map中是否有資料可以用empty()函式,它返回true則說明是空map

9,

//如果要刪除1,用迭代器刪除

      map<int, string>::iterator iter;

      iter = mapStudent.find(1);

      mapStudent.erase(iter);

 

      //如果要刪除1,用關鍵字刪除

      Int n = mapStudent.erase(1);//如果刪除了會返回1,否則返回0

 

      //用迭代器,成片的刪除

      //一下程式碼把整個map清空

      mapStudent.earse(mapStudent.begin(), mapStudent.end());

      //成片刪除要注意的是,也是STL的特性,刪除區間是一個前閉後開的集

 

相關文章