map<T, T>是C++的STL中存储key-value键值对数据结构的最基础的模板类,相对于multimap可以重复的key值,map的key是非重复的。
C++的reference这样说明的:
std::map
is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare
. Search, removal, and insertion operations have logarithmic complexity. Maps are usually implemented as red-black trees.
首先map里的数据是以key根据Compare函数排序的(sorted),可以用标准库提供的迭代器实现元素的有序遍历。下面的代码运行后输出"Hello, I am Bryce";
#include<iostream> #include<map> using namespace std; int main(){ map<int, string> amap; //contains string "Hello,I am Bryce." amap.insert(make_pair(1,"Hello,")); amap.insert(make_pair(4,"Bryce.")); amap.insert(make_pair(2,"I ")); amap.insert(make_pair(3,"am ")); string output = ""; for(map<int, string>::iterator it = amap.begin(); it!=amap.end(); ++it){ output += it->second; } cout<< output<<endl; return 0; }
再次map底层是由红黑树实现,红黑树请看July的博客 教你透彻了解红黑树。所以元素操作插入元素(insert),删除元素(erase),查找元素(find),lower_bound(value), upper_bound(value)等成员函数的时间复杂皆是O(ln n)。
用一个应用实例说明map的使用(可以达到对数级复杂度哦):查找给出数组里的出现次数最多的元素。在数组元素特征可以预知而且元素是整型或可以转化为整型并且元素的范围有限(怎么这么多限定条件啊,对,谁让你用hash的)的情况下,当然用自建Hash映射效率最高,但是在一般情况下,数组元素都是随机的,用C++标准库提供的map是不二选择(如果你用C++编程的话)。贴代码,注意细节
#include<iostream> #include<map> using namespace std; int majorityElement(int num[], int sz) { map<int,int> map; for(int itv = 0; itv != sz; ++itv){ if(map.count(num[itv]) == 0){ map.insert(pair<int,int>(num[itv],1)); }else{ int count = map[num[itv]]; map.erase(num[itv]); //注意此处要先删除,再插入新元素,如果直接调用insert元素不会更新 map.insert(pair<int,int>(num[itv],count+1)); } } int majority=0; int majKey = -1; for(std::map<int,int>::iterator it = map.begin(); it != map.end(); ++it){ //cout<<it->first<<endl; if(it->second > majority ){ majKey = it->first; majority = it->second; } } return majKey; } int main(){ int num[10] = {1,1,1,1,1,3,4,5,3,3}; cout<< majorityElement(num,10)<<endl; return 0; }
打印输出出现最多次的元素1。
对于特定问题用好map将节约很多时间。