C++ STL Map 學習報告

Map

一、map簡介

map是一類關聯式容器,它是模板類。關聯的本質在於元素的值與某個特定的鍵相關聯,而並非通過元素在數組中的位置類獲取。它的特點是增加和刪除節點對迭代器的影響很小,除了操作節點,對其他的節點都沒有什麼影響。對於迭代器來說,不可以修改鍵值,只能修改其對應的實值。

 

二、map功能

1.   自動建立Key value的對應。key value可以是任意你需要的類型,但是需要注意的是對於key的類型,唯一的約束就是必須支持<操作符

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

3.     快速插入Key - Value 記錄。

4.     快速刪除記錄

5.     根據Key 修改value記錄。

6.     遍歷所有記錄。

三、map定義

使用map得包含map類所在的頭文件:#include<map>

map對象是模板類,需要關鍵字和存儲對象兩個模板參數,基本的定義模式如下:
std:map<int, string> personnel;


這樣就定義了一個以int爲鍵,值爲stringmap對象personnel

 

map中定義了以下三個類型:

·        map<K,V>::key_type : 表示map容器中,索引的類型;

·        map<K,V>::mapped_type : 表示map容器中,鍵所關聯的值的類型;

·        map<K,V>::value_type : 表示一個pair類型,它的first元素具有const map<K, V>::key_type類型,而second元素則有map<K,V>::mapped_type類型

對迭代器進行解引用時,將獲得一個引用,指向容器中一個value_type類型的值,對於map容器,其value_typepair類型。

爲了使用方便,可以對模板類進行一下類型定義,

typedef map<int, CString>UDT_MAP_INT_CSTRING; 
UDT_MAP_INT_CSTRING enumMap;

四、添加元素

 

給map中添加元素主要有兩種方法:

    1. 使用下標操作符獲取元素,然後給元素賦值,如:

         map<string, int> word_count; // 定義了一個空的map對象word_count;

         word_count ["Anna"] = 1;

          程序說明:

         1.在word_count中查找鍵爲Anna的元素,沒有找到.

         2.將一個新的鍵-值對插入到word_count中,他的鍵是conststring類型的對象,保存Anna。而他的值則採用直初始化,這就意味着在本例中指爲0.

         3.將這個新的鍵-值對插入到word_count中

         4.讀取新插入的元素,並將她的值賦爲1

          使用下標訪問map與使用下標訪問數組或者vector的行爲是截然不同的:使用下標訪問不存在的元素將導致在map容器中添加一個新的元素,他的鍵即爲該下標值。

·        使用map::insert方法添加元素

         map容器提供的insert操作:

         1. map.insert(e) : e是一個用在map中的value_type類型的值。如果鍵不存在,則插入一個值爲e.second的新元素;如果鍵在map中已經存在,那麼不進行任何操作。該函數返回一個pair類型,該pair類型的first元素爲當前插入emap迭代器,pairsecond類型是一個bool類型,表示是否插入了該元素。

         2. map.insert(beg, end) : begend是迭代器,返回void類型

         3. map.insert(iter, e) : evalue_type類型的值,如果e.first不在map中,則創建新元素,並以迭代器iter爲起點搜索新元素存儲的位置,返回一個迭代器,指向map中具有給定鍵的元素。

如: 

          word_count.insert(map<sting,int>::value_type("Anna", 1));

         word_count.insert(make_pair("Anna", 1)); 

         返回值:如果該鍵已在容器中,則其關聯的值保持不變,返回的bool值爲true

五、獲取元素

使用下標獲取元素存在一個很危險的副作用:如果該鍵不在map容器中,那麼下標操作會插入一個具有該鍵的新元素。

因此引入map對象的查詢操作:

map.count(k): 返回map中鍵k的出現次數(對於map而言,由於一個key對應一個value,因此返回只有01,因此可以用此函數判斷k是否在map)

map.find(k):  返回map中指向鍵k的迭代器,如果不存在鍵k,則返回超出末端迭代器。

 如: 

int occurs = 0;

if( word_count.cout("foobar") )

     occurs =word_count["foobar"];

int occurs = 0;

map<string, int>::iterator it =word_count.find("foobar");

if( it != word_count.end() )

     occurs = it ->second;

 

 

六、刪除元素

移除某個map中某個條目用erase()

該成員方法的定義如下:

1.     iteratorerase(iterator it); //通過一個條目對象刪除

2.     iteratorerase(iterator first, iteratorlast);        //刪除一個範圍

3.     size_typeerase(const Key& key); //通過關鍵字刪除

七、迭代遍歷 

與其他容器一樣,map同樣提供begin和end運算,以生成用於遍歷整個容器的迭代器

發佈了35 篇原創文章 · 獲贊 45 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章