map使用手冊

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());
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章