C++抽象编程——如何修改map中的值

来源:互联网 发布:曹县大集淘宝村 编辑:程序博客网 时间:2024/06/06 17:54

思路的由来

刚刚在写一个程序,要用到将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 << '\n';  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。答案就是如我们所想的,完美覆盖!结果如下:

总结

其实这样子看很简单,我们可以用一个函数来概括如何去修改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;}

结果如下:

0 0