思路的由来
刚刚在写一个程序,要用到将map中的值给改变,但是那是书本上提供的put()函数(我记得java好像也提供这一类的函数吧),我们的C++并不具有这样的功能,所以我便去搜索了一下大家的建议,发现确实是没有这个函数,要实现还是得自己来。我看的最多的还是说:先用eraser函数擦除,然后我们再进行赋值。没错我一开始我也是这样去想,也打算这样子去做的。就当我准备操作一番的时候,我在C++的网站上看到了让我眼前一亮的map初始化的方式,真的很方便而且我还没见过,先上一份那个网站的代码出来
// erasing from map
#include <iostream>
#include <map>
int main ()
{
std::map<char,int> mymap;
std::map<char,int>::iterator it;
// insert some values:这种输入方法很适合我们的习惯
mymap['a']=10;
mymap['b']=20;
mymap['c']=30;
mymap['d']=40;
mymap['e']=50;
mymap['f']=60;
it=mymap.find('b');
mymap.erase (it); // erasing by iterator
mymap.erase ('c'); // erasing by key
it=mymap.find ('e');
mymap.erase ( it, mymap.end() ); // erasing by range
// show content:
for (it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '
';
return 0;
}
思考
让我眼前一亮的是,这赋值居然可以像数组一样。够方便,**而且map容器自带了first,跟second两个成员,分别对应的是key跟value。**我们完全可以利用这一点来输出map。
现在,让我们想一想,如果我们可以像数组那样赋值,那么我们是不是也可以像数组那样更改对应的值呢? 猜测不能乱猜,就让我们撸一下代码试试:
#include <iostream>
#include <map>
using namespace std;
int main(){
map<string,string> mymap;
map<string,string>::iterator it;//用于检测改变值后迭代器是否会发生变化
mymap["hello"] = "world";
string key = "hello" ;
cout << mymap[key] ;
cout << endl;
mymap[key] = "redAnt";
cout << mymap[key] ; //输出此时key对应的值
cout << endl;
it = mymap.begin(); //将map的首个迭代器的值赋给it
cout << (it -> first) << " " << (it ->second);
return 0;
}
分析
我们先把字符串“world”赋值给标签“hello”,然后定义一个string的变量key来储存标签(至于为什么,待会说)。先输出此时key对应的值,(就是“world”)。然后我们将字符串“redAnt”再赋值给key,再输出此时key对应的值。最后用迭代器查看一下是不是覆盖了,还是新建了一个map。答案就是如我们所想的,完美覆盖!结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aET775L-1661997285013)(http://i.imgur.com/F6yHcuX.png)]
总结
其实这样子看很简单,我们可以用一个函数来概括如何去修改map中的值:
void changeMap(map<string,string> &mymap, string key,string value){
mymap[key] = value;
}
运行一下
#include <iostream>
#include <map>
using namespace std;
void changeMap(map<string,string> &mymap, string key,string value);
int main(){
map<string,string> mymap;
map<string,string>::iterator it;//用于检测改变值后迭代器是否会发生变化
mymap["hello"] = "world";
string key = "hello" ;
cout << mymap[key] ;
cout << endl;
string value = "redAnt";
changeMap(mymap, key, value);
it = mymap.begin(); //将map的首个迭代器的值赋给it
cout << (it -> first) << " " << (it ->second);
return 0;
}
void changeMap(map<string,string> &mymap, string key,string value){
mymap[key] = value;
}
结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2sShuDDN-1661997285014)(http://i.imgur.com/tVYWf3m.png)]
]