STL是标準C++系統的一組模闆類,使用STL模闆類最大的好處就是在各種C++編譯器上都通用。
在STL模闆類中,用于線性資料存儲管理的類主要有vector, list, map 等等。本文主要針對map對象,結合自己學習該對象的過程,講解一下具體用法。本人初學,水準有限,講解差錯之處,請大家多多批評指正。
map對象所實作的功能跟MFC得CMap相似,但是根據一些文章的介紹和論述,MFC CMap在個方面都與STL map有一定的差距,例如不是C++标準,不支援指派構造,對象化概念不清晰等等。
使用map對象首先要包括頭檔案,包含語句中必須加入如下包含聲明
#include <map>
注意,STL頭檔案沒有擴充名.h
包括頭檔案後就可以定義和使用map對象了,map對象是模闆類,需要關鍵字和存儲對象兩個模闆參數,例如:
std:map<int, CString> enumMap;
這樣就定義了一個用int作為關鍵字檢索CString條目的map對象,std表示命名空間,map對象在std名字空間中,為了友善,在這裡我仍然使用了CString類,其實應該使用标準C++的std::string類,我們對模闆類進行一下類型定義,這樣用的友善,當然,不定義也可以,代碼如下:
typedef std:map<int, CString> UDT_MAP_INT_CSTRING; UDT_MAP_INT_CSTRING enumMap;
如此map對象就定義好了,增加,改變map中的條目非常簡單,因為map類已經對[]操作符進行了重載,代碼如下:
enumMap[1] = "One"; enumMap[2] = "Two"; ..... enumMap[1] = "One Edit";
或者insert方法
enumMap.insert(make_pair(1,"One"));
傳回map中目前存儲條目的總數用size()方法:
int nSize = enumMap.size();
查找map中是否包含某個關鍵字條目用find方法,傳入的參數是要查找的key,在我們的例子裡,是一個int資料,map中的條目資料是順序存儲的,被稱作為一個sequence,在這裡需要提到的是begin()和end()兩個成員,分别代表map對象中第一個條目和最後一個條目,這兩個資料的類型是iterator,iterator被定義為map中條目的類型,查找是否包含某個條目的代碼如下:
int nFindKey = 2; //要查找的Key UDT_MAP_INT_CSTRING::iterator it; //定義一個條目變量(實際是指針) it = enumMap.find(nFindKey); if(it == enumMap.end()) { //沒找到 } else { //找到 }
//find的時候注意key的資料類型,最好用CString之類的能消除資料類型差異的key,否則可能會出現強制轉換後仍找不到的情況。
需要說明的是iterator, begin(), end()是STL模闆類的一個通用概念,操作方法也大同小異
通過map對象的方法擷取的iterator資料類型是一個std::pair對象,包括兩個資料 iterator.first 和 iterator.second 分别代表關鍵字和存儲的資料
移除某個條目用erase() 該成員方法的定義如下
iterator erase(iterator it); iterator erase(iterator first, iterator last); size_type erase(const Key& key);
分析一下這三個重載方法定義,大家不用說也能看明白一點點了吧,第一個通過一個條目對象删除,這個對象可以從find之類的方法獲得,第二個定義删除一個範圍,需要一個起始條目和一個終止條目,第三個通過關鍵字删除,這個與我們的想法和習慣最接近,代碼例子如下:
enumMap.erase(1); //删掉關鍵字“1”對應的條目 enumMap.erase(enumMap.begin()); //删掉第一個條目 enumMap.erase(enumMap.begin(), enumMap.begin() + 1); //删掉起始的兩個條目
呵呵,增删改查都說完了,相信讀過本文,map對象也應該會使用了,這些是我1個多星期來鑽研的結果,拿出來與大家分享。
最後,還有一個clear(),不用問,全删的時候就不要一個一個erase了,clear()就相當于enumMap.erase(enumMap.begin(), enumMap.end());
map的周遊:
#include<map> #include<string> #include<iostream> using namespace std;
int main() { map<string,int> m; m["a"]=1; m["b"]=2; m["c"]=3; map<string,int>::iterator it; for(it=m.begin();it!=m.end();++it) cout<<"key: "<<it->first <<" value: "<<it->second<<endl; return 0; }
map<string,int>::iterator it; 定義一個疊代指針it。
it->first 為索引鍵值,it->second 為值。
在對象中應用時,最好在析構函數中要調用它的clear方法,
例如class a{
map<int,int> m;
~a(){
m.clear();
}
}