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

思路的由来

刚刚在写一个程序,要用到将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)]

]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值