C++STL的map是一个类模板,属于关联容器,提供一对一的hash,自动建立key->value的映射,内部由红黑树实现。
以一个map常用的场景阐述map的用法
1. 实例化map, 关键字类型为string,值类型为int,利用map的关键字不可重复性,统计关键字(单词)出现的次数
#include<map>
typedef map<string, int> MAP_STRING_CINT;
MAP_STRING_CINT WordCount;
2. map元素插入的方法:
1)以[key]的方式插入(若key存在,则修改,反之插入);
2)使用map.insert()函数以pair的形式插入:
Map.insert(make_pair(key, value));
或者
Map.insert(pair<keytype, valuetype>(key, value));
或者
Map.insert(map<keytype, valuetype>::value_type(key, value));
为了方便修改,使用[]方法:
typedef vector<string> VEC_STRING;
VEC_STRING strs = {"aw","aw","ber","cd","ber","aw","cd","dhg","cd","aw"};
for(int i=0;i< strs.size();i++)
WordCount[strs[i]]++;
3. map是按key有序的(从小到大),所以WordCount按照单词首字母有序,如果我们想得到单词出现次数有序的,需要对value排序。借助vector。
typedef pair<string, int> PAIR_STRING_INT;
typedef vector<PAIR_STRING_INT> VEC_PAIR_STRING_CINT;
typedef vector<PAIR_STRING_INT>* pVEC_PAIR_STRING_CINT;
int compare(const PAIR_STRING_INT x, const PAIR_STRING_INT y) {
return x.second > y.second; //按value从大到小排序
}
void sortMapbyValue(MAP_STRING_CINT WordCount, pVEC_PAIR_STRING_CINT pVec) {
for (MAP_STRING_CINT::iterator iter = WordCount.begin(); iter != WordCount.end(); iter++) {
pVec->push_back(make_pair(iter->first,iter->second)); //vetcor允许元素在尾部快速插入
}
sort(pVec->begin(), pVec->end(), compare); //排序,使用自定义比较函数compare,参数类型为vector的元素类型pair<string, int>
}
//
pVEC_PAIR_STRING_CINT pVec = new VEC_PAIR_STRING_CINT();
sortMapbyValue(WordCount,pVec);
for(VEC_PAIR_STRING_CINT::iterator iter = pVec->begin(); iter !=pVec->end(); iter++)
std::cout << iter->first << ":" << iter->second << std::endl;
4. 使用map.find()函数按key查找元素, 若存在,返回key->value的pair,若不存在,返回map.end();
map重载了[]和at()函数,也可以使用,map.[key]和map.at(key)来查找得到key所对应的value, 但不安全。
int cnt;
MAP_STRING_CINT::iterator iter = WordCount.find("cdr");
if (iter != WordCount.end())
cnt = iter->second ;
cnt = WordCount.at("cdr"); // 当查找关键字"cdr"在map中不存在时,引发异常
cnt = WordCount["cdr"]; // 同上
5. 删除和清空
//删除和清空
int sec = WordCount.erase("cd"); //删除失败则返回1, 关键字不存在或者删除失败返回0
WordCount.clear();
写在最后:
Elevenoo is a smart and beautiful girl .