1.什麼是map
map是一個鍵值對容器。在處理一對一數據是,頗有用。ios
2.map數據結構的特色
map內部自建一顆紅黑樹,這棵樹具備對數據自動排序的功能,
所以,map內的數據都是按key的值排好序的。數組
3.map數據插入
數據的插入有三種方法:
第一種,調用insert函數,插入pair類型數據
示例以下所示:數據結構
#include <map> #include <string> #include <iostream> Using namespace std; int main() { map<int, string> mapStudent; mapStudent.insert(pair<int, string>(1, 「student_one」)); mapStudent.insert(pair<int, string>(2, 「student_two」)); mapStudent.insert(pair<int, string>(3, 「student_three」)); map<int, string>::iterator iter; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { cout<<iter->first<<」 」<<iter->second<<end; } return 0; }
第二種,調用insert插入value_type類型數據
示例以下所示:函數
#include <map> #include <string> #include <iostream> Using namespace std; int main() { map<int, string> mapStudent; mapStudent.insert(map<int, string>::value_type(1, 「student_one」)); mapStudent.insert(map<int, string>::value_type(2, 「student_two」)); mapStudent.insert(map<int, string>::value_type(3, 「student_three」)); map<int, string>::iterator iter; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { cout<<iter->first<<」 」<<iter->second<<end; } return 0; }
第三種,使用數組賦值方式spa
#include <map> #include <string> #include <iostream> Using namespace std; int main() { map<int, string> mapStudent; mapStudent[1]="student_one"; mapStudent[2]="student_two"; mapStudent[3]="student_three"; map<int, string>::iterator iter; for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { cout<<iter->first<<」 」<<iter->second<<end; } return 0; }
如何判斷數據是否插入成功?
insert函數的返回值類型爲:Pair<map<int,string>::iterator,bool>
返回值的key值表示,返回map的迭代器
返回值的value值表示,是否插入成功
所以,咱們可使用如下代碼來判斷,map鍵值對是否插入成功指針
Pair<map<int,string>::iterator,bool> Insert_Pair=mapStudent.insert(pair<int, string>(1, 「student_one」)); if(Insert_Pair.second) cout<<"success.\n"; else cout<<"failed.\n";
4.map數據查找
第一種,使用count方法斷定是否存在
第二種,使用find方法,定位key出現的位置,該方法返回一個迭代器。
當數據出現時,返回數據所在位置的迭代器;
不然,返回的迭代器等於end方法返回的迭代器。
示例代碼以下:code
map<int,string>::iterator iter; iter=mapStudent.find(1); if(iter!=mapStudent.end()) cout<<"success find.\n"; else cout<<"failed.\n";
第三種,使用Lower_bound,Upper_bound方法,返回key的邊界,在此,再也不詳細介紹。blog
5.map數據刪除
使用了咱們很熟悉的erase函數,map中該函數有三個重載。
1)使用迭代器刪除排序
map<int,string>::iterator iter; iter = mapStudent.find(1); mapStudent.erase(iter);
2)使用關鍵字key刪除three
int result = mapStudent.erase(1);
成功返回1,不然返回0
3)使用迭代器,刪除區間內的數據
mapStudent.erase(mapStudent.begin(),mapStudent.end());
6.關於map的自動排序
前面咱們說過,map內的數據會根據key值由大到小排序,
也就是說key值必須支持小於<運算,不然沒法插入map。
對於上面的示例,咱們知道int類型自己是支持小於運算的。
可是對於不支持小於運算的key類型,咱們該如何插入map呢?
很顯然,咱們須要自定義該類型的<操做符。
以下例所示,咱們要創建一個map<學生信息,分數>:
typedef struct tagStudentInfo { int nID; string strName; bool operator<(tagStudentInfo const &_A) const { if(nID<_A.nID) return true; return false; } }StudentInfo,*PStudentInfo; int main() { map<StudentInfo,int> mapStudent; StudentInfo studentInfo; studentInfo.nID=1; studentInfo.strName="student_one"; mapStudent.insert(pair<StudentInfo, int>(studentInfo,80)); return 0; }
另一種方式是,定義一個單獨的類,類中定義key類型的比較函數
示例代碼以下:
typedef struct tagStudentInfo { int nID; string strName; }StudentInfo,*PStudentInfo; class sort { public: bool operator()(tagStudentInfo const &_A,tagStudentInfo const &_B) const { if(_A.nID<_B.nID) return true; return false; } } int main() { map<StudentInfo,int,sort> mapStudent; StudentInfo studentInfo; studentInfo.nID=1; studentInfo.strName="student_one"; mapStudent.insert(pair<StudentInfo, int>(studentInfo,80)); return 0; }
7.map內存佔用
前面咱們介紹過,map的數據結構爲一顆紅黑樹,
該樹的一個節點在不保存數據時,佔用16字節的空間,
包括一個父節點指針,左右孩子指針,還有一個枚舉值(標示紅黑的,至關於平衡二叉樹中的平衡因子),
可見,map仍是很耗內存的。