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;
		}
	}

猜你喜欢

转载自blog.csdn.net/hongtao45/article/details/82890846