最近寫的一道題用到了STL中的map,這部分內容之前沒有系統學過,這里就簡單歸納一下吧。
資料來源:
https://www.w3cschool.cn/cpp/cpp-fu8l2ppt.html
http://c.biancheng.net/view/338.html
https://blog.csdn.net/u010429424/article/details/75332700
常用操作:
- 添加元素:可以用Insert,也可以下標添加
map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最簡單最常用的插入添加!
2.查找:注意,map中元素是key-value配對的,要查找一個元素,需要提供它的key。map的內部是以平衡二叉樹形式儲存的,所以查找的速度為O(logn),速度很快。
另外,這也意味着,map內部的元素是有序的!所以我們如果只是需要一個按key排序的輸出的話,不需要對map進行排序,直接遍歷輸出即可。
3.遍歷:map的遍歷是通過迭代器完成的:
1) 正向迭代器,定義方法如下:()
容器類名::iterator 迭代器名;
2) 常量正向迭代器,定義方法如下:
容器類名::const_iterator 迭代器名;
3) 反向迭代器,定義方法如下:
容器類名::reverse_iterator 迭代器名;
4) 常量反向迭代器,定義方法如下:
容器類名::const_reverse_iterator 迭代器名;
遍歷過程:
map<int, int>::iterator iter; iter = _map.begin(); while(iter != _map.end()) { cout << iter->first << " : " << iter->second << endl; iter++; }
注意這里的map.end(),它和map.begin(),map.lower_bound(),map.upper_bound()一樣,返回的是一個迭代器而不是元素本身。
*易錯點:
map::lower_bound(key):返回map中第一個大於或等於key的迭代器指針
map::upper_bound(key):返回map中第一個大於key的迭代器指針
另外:
1.對於map中沒有的key,如果訪問的話返回的value為0;
2.map雖然有“下標”訪問並且內部元素是有序的,但這不代表可以實現類似數組的下標訪問,即訪問第0個、第1個·····第n個元素。
3.map中的end()指向的不是最后一個元素,而是最后一個元素的下一個元素,這樣是為了遍歷時的方便,即使用while(iter != _map.end())的條件變量時可以遍歷到最后一個元素。
舉個例子:
#include<bits/stdc++.h> using namespace std; int main(){ map<int,int>testmap; testmap[0]=8; testmap[2]=9; //重要!end()指向的是下一個而非尾部 cout<<"begin's first:" <<testmap.begin()->first<<"begin's second:"<<testmap.begin()->second<<" end's first: "<<testmap.end()->first<<endl; cout<<testmap[1]<<endl; getchar(); }
結果為:
map<int ,string> maplive; 1.maplive.insert(pair<int,string>(102,"aclive")); 2.maplive.insert(map<int,string>::value_type(321,"hai")); 3, maplive[112]="April";//map中最簡單最常用的插入添加!