map的基本操作
向map添加元素:
因为map是不允许出现重复关键字的,所以如果重复插入键相同的元素后面的元素是不会插入成功的,下面是一个验证程序:
#include<iostream> #include<algorithm> #include<map> #include<string> using namespace std; int main() { map<string, int> mmap; mmap.insert({ "wu",1 }); mmap.insert({ "xiao",1}); mmap.insert({ "wu",2 }); mmap.insert({ "xiao",8 }); for (auto it : mmap) { cout << it.first << " " << it.second << endl; } return 0; }
运行结果:
从运行结果我们可以知道,mmap的第三条个第四条插入语句时没法插入成功的,因为前面已经对相同键值做过了插入操作,后面就不会再插入了。
如果想要四条语句都插入成功可以考虑用multimap,multimap是可以存在重复键值的,下面是验证程序
#include<iostream> #include<algorithm> #include<map> #include<string> using namespace std; int main() { multimap<string, int> mmap; mmap.insert({ "wu",1 }); mmap.insert({ "xiao",1}); mmap.insert({ "wu",2 }); mmap.insert({ "xiao",8 }); for (auto it : mmap) { cout << it.first << " " << it.second << endl; } return 0; }
运行结果:
map容器最常用的方法——kv对计数,如果插入的元素还没存在就插入,并给value赋值为1,如果插入的元素已经存在就不再插入而是给对应的键的值加1
#include<iostream> #include<algorithm> #include<map> #include<string> using namespace std; int main() { map<string, int> mmap; string str; while (cin >> str) { mmap[str]++; } for (auto it : mmap) { cout << it.first << " " << it.second << endl; } return 0; }
运行结果:
map的各种插入数据方式:
#include <iostream> #include<string> #include<vector> #include<map> using namespace std; int main() { map<string, int>mmap; mmap.insert(pair<string,int>("fsdfads", 43));//第一种插入方式 mmap.insert(map<string, int>::value_type("fsdf", 5));//第二种 mmap["fsdff"] = 3;//第三种 mmap.insert({ "fsd",4 });//第四种 for (auto it : mmap) { cout << it.first << " " << it.second << endl; } return 0; }
运行结果:
对map中的value进行排序
#include <iostream> #include<string> #include<vector> #include<map> #include<algorithm> using namespace std; int main() { map<string, int>mmap; vector<pair<string, int>>vec; mmap.insert(pair<string,int>("fsdfads", 43)); mmap.insert(map<string, int>::value_type("fsdf", 5)); mmap["fsdff"] = 3; mmap.insert({ "fsd",4 }); //将map的key和value以pair的形式装到vector中,对vector进行排序。 for (auto it = mmap.begin(); it != mmap.end(); it++) { vec.push_back(make_pair(it->first, it->second)); } sort(vec.begin(), vec.end(), [](const pair<string, int>&x, const pair<string, int>&y) {return x.second < y.second; }); for (auto it : vec) { cout << it.first << " " << it.second << endl; } return 0; }
运行结果:
#include <iostream> #include <cstdlib> #include <map> #include <vector> #include <string> #include <algorithm> using namespace std; int cmp(const pair<string, int>& x, const pair<string, int>& y) { return x.second > y.second; } void sortMapByValue(map<string, int>& tMap, vector<pair<string, int> >& tVector) { for (map<string, int>::iterator curr = tMap.begin(); curr != tMap.end(); curr++) tVector.push_back(make_pair(curr->first, curr->second)); sort(tVector.begin(), tVector.end(), cmp); } int main() { map<string, int> tMap; string word; while (cin >> word) { pair<map<string, int>::iterator, bool> ret = tMap.insert(make_pair(word, 1)); if (!ret.second) ++ret.first->second; } vector<pair<string, int>> tVector; sortMapByValue(tMap, tVector); for (int i = 0; i < tVector.size(); i++) cout << tVector[i].first << ": " << tVector[i].second << endl; system("pause"); return 0; }