文章目錄
map的使用手冊
- 我找不到之前參考的博文鏈接了,只好寫原創,對於原創作者感到抱歉
map的介紹
- map是鍵值對<key,value>數據集合,key必須唯一
- 主要用來查找key對應value,要求key必須是可排序的,必須支持<比較運算符
- map默認是以key升序存放鍵值對<key,value>數據,比較適合二分查找
map的內部結構
- map使用pair<key,value>類模板保存key與value
- pair<key,value>有兩個public成員變量:first和second
- first存放key
- second存放value
- 在map裏面可以使用map<>::value_type表示pair<key,value>
map的操作
map插入數據
- 用insert函數插入數據,在數據的插入上涉及到集合的唯一性
- 即當map中存在該關鍵字時,insert操作無法插入數據
- 如果用數組方式,它可以覆蓋以前該關鍵字對應的值
map<int,string> m;
//insert形式
m.insert({ 1,"ABC"});//這樣就行
m.insert(2,make_pair(string("ABC")));
m.insert(map<int,string>::value_type(3,"ABC"));
//數組形式
m[1]="efg";
map初始化
一般map的初始化
//列表初始化
map<int,string> m={{1,"duanjie"},{2,"yanwanli"}};
//數組賦值
m[3]="adc";
//insert添加
m.insert({ 4,"ABC"});
多層嵌套map的初始化
map<int, map<string, vector<string>>> m;
m[1]["abc"].push_back("ABC");
map遍歷
第一種:應用前向迭代器
map<int,string> m={{1,"abc"},{2,"def"}};
//第1種
map<int,string>::iterator iter;
iter = m.begin();
while(iter != m.end()){
cout << iter->first << "-" << iter->second << endl;
iter++;
}
//第2種
for(auto &it : m){
cout << it.first << "-" << it.second <<endl;
}
第二種:應用反相迭代器
- 實現反向遍歷
map<int,char> m;
for(map<int,char>::reverse_iterator rit=m.rbegin();rit!=m.rend();rit++)
cout<<(*rit).first<<","<<(*rit).second<<endl;
第三種,用數組的形式
//數組形式
map<int,string> m;
int L=m.size();
for(int i=1;i<=L;i++){
cout<<m[i]<<" ";
}
map的數據查找
第一種:count函數判斷
- 其缺點是無法定位數據出現位置,由於map的特性,一對一的映射關係,就決定了count函數的返回值只有兩個,要麼是0,要麼是1,出現的情況,當然是返回1了
map<int,string> m={{1,"abc"},{2,"edf"}};
if(m.count(1)){
cout<<"YES"<<endl;
}
第二種:find函數
- 定位數據出現位置
- 它返回的一個迭代器,當數據出現時,它返回數據所在位置的迭代器,如果map中沒有要查找的數據,它返回的迭代器等於end函數返回的迭代器
map<int,string> m={{1,"abc"},{2,"edf"}};
map<int, string>::iterator iter;
iter =m.find(1);
if(iter !=m.end())
{
cout<<"Find it :"<<iter->second<<endl;
}
else{
cout<<"Not Found!"<<endl;
}
第三種:lower_bound函數與upper_bound函數
- lower_bound函數用法,這個函數用來返回要查找關鍵字的下界(是一個迭代器)
- upper_bound函數用法,這個函數用來返回要查找關鍵字的上界(是一個迭代器)
例如:map中已經插入了1,2,3,4的話,如果lower_bound(2)的話,返回的2,而upper-bound(2)的話,返回的就是3,如果兩個迭代器相等就意味着不存在這個關鍵字
map<int,string> m={{1,"abc"},{4,"edf"}};
map<int, string>::iterator iter1,iter2;
iter1 =m.lower_bound(2);
iter2=m.upper_bound(2);
if(iter1->first==iter2->first)
{
cout<<"Not Found!"<<endl;
}
else{
cout<<"Find it :"<<iter1->second<<endl;
}
map的數據刪除
erase()函數
- 移除某個map中某個條目用erase()
iterator erase(iterator it);//通過一個條目對象刪除
iterator erase(iterator first,iterator last)//刪除一個範圍
size_type erase(const Key&key);//通過關鍵字刪除
//例如
map<int,string> m={{1,"abc"},{4,"edf"}};
map<int, string>::iterator iter1,iter2;
m.erase(1);
if(m.count(1)){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
clear()函數
- clear()函數相當於
enumMap.erase(enumMap.begin(),enumMap.end());