map 删除和替换元素时需要注意的细节

map:映射

//注
std::map <key,value> c;
c[key];

返回一个引用,指向键值为key的元素,但如果元素不存在,就安插该元素
对于这一点,应该注意,不过有应该注意的地方,就是可能出错的地方,这就代表需要改进。但是这样设计,有利有弊。
1:可以直接使用下标索引来直接插入元素
2:如果不小心输错键值,且键值不存在在map里面,就会直接插入一个新的元素,而不会报错

//错误的想法
        typedef std::map<std::string,float> StringFloatMap;
        StringFloatMap coll;
        StringFloatMap::iterator pos;
        //……
        for(pos=coll.begin(); pos!=coll.end(); pos++)
        {     
        		if(pos->second==value)    
        		{        
       		 coll.erase(pos);//error!!!    
        		}
        }
        //对pos 实施erase(),之后会使得pos不再是一个有效的iterator
// 正确做法应该是:
  typedef std::map<std::string,float> StringFloatMap;
  StringFloatMap coll;
  StringFloatMap::iterator pos;
 // ……
 for(pos=coll.begin(); pos!=coll.end();  )
 {     
     	if(pos->second==value)    
     	{        
     		coll.erase(pos++);//!!!
        }    
         else        
         ++pos;
}

不可以使用直接修改key值

//例如这样的代码
map<key,value> ::iterator pos;
pos->second//可以获得元素的实值
//尝试使用
//pos->first=key_;
//会出现错误

如果非要修改key的值,唯一的方法,就是使用value相同旧元素替换为元素

template <class cont>
bool replace_key( cont& c,
			const typename cont::key_type& old_key,
			const typename cont::key_type& new_key )
	{
		typename cont::iterator pos;//需要加上type来体现cont是模板
		pos=c.find(old_key);
		//有key_type value_type 两个容器提供的类型,可以用来代表键与实值
		if (pos!=c.end() )
		{
			c.insert( typename cont::value(new_key,pos->second));
			c.remove(pos);
			return true;
		}
		else
		{
			return false;
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值