1. 程式人生 > >C++(十二)— map的基本使用

C++(十二)— map的基本使用

color 能力 val 映射 出現 mes 意義 main 函數

  標準庫map類型是一種以鍵-值(key-value)存儲的數據類型。

  map是STL的一個關聯容器。它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由於這個特性,它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這裏說下map內部數據的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的。

1、map特點

  map是一類關聯式容器。它的特點是增加和刪除節點對叠代器的影響很小,除了那個操作節點,對其他的節點都沒有什麽影響。對於叠代器來說,可以修改實值,而不能修改key

  自動建立Key - value的對應。key 和 value可以是任意你需要的類型。

  根據key值快速查找記錄,查找的復雜度基本是Log(N),如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。

  快速插入Key -Value 記錄。快速刪除記錄,根據Key 修改value記錄。遍歷所有記錄。

2、map對象的一些基本操作

  因此,若只是查找該元素是否存在,可以使用函數count(k),該函數返回的是k出現的次數;若是想取得key對應的值,可以使用函數find(k),該函數返回的是指向該元素的叠代器。

  第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置,由於map的特性,一對一的映射關系,就決定了count函數的返回值只有兩個,要麽是0,要麽是1,出現的情況,當然是返回1了

  第二種:用find函數來定位數據出現位置,它返回的一個叠代器,當數據出現時,它返回數據所在位置的叠代器,如果map中沒有要查找的數據,它返回的叠代器等於end函數返回的叠代器。

  查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這裏需要提到的是begin()和end()兩個成員,分別代表map對象中第一個條目和最後一個條目,這兩個數據的類型是iterator.

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include
<string> #include<map> using namespace std; int main() { map<char, int> p; //map中插入元素 p.insert(make_pair(a,10)); p.insert(make_pair(c,9 )); p.insert(make_pair(b,10 )); //采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。 //p[‘y‘] = 17; //p[‘f‘] = 11; map<char, int>::iterator it; for (it = p.begin(); it != p.end(); it++) cout << (*it).first << " " << (*it).second << endl; /*用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置, 由於map的特性,一對一的映射關系, 就決定了count函數的返回值只有兩個,要麽是0,要麽是1,出現的情況,當然是返回1了*/ if (p.count(b)) { //返回出現次數,0或者1. cout << p.count(b) << endl; } //用find函數來定位數據出現位置,它返回的一個叠代器 map<char, int>::iterator iter; iter = p.find(b); if (iter != p.end()) cout << "Find, the value is " << (*iter).second << endl; else cout << "Do not Find" << endl; system("pause"); return 0; }

  刪除元素方法。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include <vector>
#include<string>
#include<map>
using namespace std;



int main()
{
    map<char, int> p;
    //map中插入元素
    p.insert(make_pair(a,10));
    p.insert(make_pair(c,9 ));
    p.insert(make_pair(b,10 ));
    //采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。
    //p[‘y‘] = 17;
    //p[‘f‘] = 11;

    map<char, int>::iterator it;
    for (it = p.begin(); it != p.end(); it++)
        cout << (*it).first << "   " << (*it).second << endl;

    //如果你要演示輸出效果,請選擇以下的一種,你看到的效果會比較好  
    //如果要刪除1,用叠代器刪除  
    map<char, int>::iterator iter;
    iter = p.find(1);
    p.erase(iter);
    //如果要刪除1,用關鍵字刪除  
    int n = p.erase(1);//如果刪除了會返回1,否則返回0  
    //用叠代器,成片的刪除  一下代碼把整個map清空  
    p.erase(p.begin(), p.end());
    //成片刪除要註意的是,也是STL的特性,刪除區間是一個前閉後開的集合  
    //自個加上遍歷代碼,打印輸出吧  

    
    system("pause");
    return 0;
}

C++(十二)— map的基本使用