我在上篇博客中讲到,map的主要特点是 会将所有键值对按key 值升序排列 且map中的key值不允许重复, 了解更多关于map 和multimap 的知识的可以查看这篇博客:STL进阶之树形的关联式容器——map和multimap
下面我们就用map 的接口实现< k,v >模型中以key为关键字的排序
1. find(key) + iterator insert(iterator position,make_pair())
原理:find(key)可返回查找key 后迭代器的位置,insert可插入迭代器的参考位置
故先用find查找map 内含key的键值对,若找到就直接修改该位置的value值,若没有找到则需要在这个参考位置用insert 插入新的键值对(make_pair())
代码如下:
#include <iostream>
#include <string>
#include <map>
using namespace std;
void Test1()
{
string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
map<string, int> countmap;
for (const auto&e : strs) //遍历strs,统计结果放入map中
{
map<string, int>::iterator it = countmap.find(e);
if (it != countmap.end()) //map中存在key
{
it->second++;
cout<<"已有key值"<<e<<",value加1操作"<<endl;
}
else //map中不存在key
{
cout<<"没有key值"<<e<<",插入操作"<<endl;
countmap.insert(make_pair(e, 1));
}
}
cout<<endl<<"统计结果如下:"<<endl;
map<string, int>::iterator cit = countmap.begin(); //遍历打印
while (cit != countmap.end())
{
cout<< cit->first << ":" << cit->second << " ";
++cit;
}
}
2. pair <iterator,bool> + insert(make_pair())
原理:此函数会主动判断插入key值是否成功,并将结果放在bool中
所以我们不需要用find 进行判断,直接用bool的结果进行操作,若bool==true 则表明插入成功,若bool ==false 则表明已插入过一次只需修改value值即可
代码如下:
void Test2()
{
string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
map<string, int> countmap;
for (const auto& e : strs)
{
pair<map<string, int>::iterator, bool> ret = countmap.insert(make_pair(e,1)); //bool==true则插入成功
if (ret.second == false) //如果含key 的键值对已经存在,则只修改value 的值
{
ret.first->second++;
cout<<"已存在key值"<<e<<",只修改value+1"<<endl;
}
}
cout<<endl<<"统计结果如下:"<<endl;
map<string, int>::iterator cit = countmap.begin(); //遍历打印
while (cit != countmap.end())
{
cout << cit->first << ":" << cit->second << " ";
++cit;
}
}
3. operator [ ]
原理:m[key] 会直接返回key 对应的value值
所以若key对应的value 值已经存在则被修改,若未存在就会自动插入
代码如下:
void Test3()
{
string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
map<string, int> countmap;
for (const auto&e : strs)
{
countmap[e]++; //存在则直接进行++操作,不存在则先插入(默认value=0)再++
}
map<string, int>::iterator cit = countmap.begin(); //遍历打印
while (cit != countmap.end())
{
cout << cit->first << ":" << cit->second <<" ";
++cit;
}
}
这里,大家可以思考一下。为什么multimap 中没有[ ] 操作符?
其实是因为multimap 与map 的最本质上的特点的不同导致的,因为multimap允许key值重复,那么我们使用multimap[key]就没法得到唯一的value结果,当然就没法用[]操作符进行某个元素的访问或者其他操作了。
想不起来二者有什么不同的可以查看我上篇博客最后的小结:STL进阶之树形的关联式容器——map和multimap