关于map::operator[]与map::insert (浏览次数:1002)
发表于2008-7-18 11:44:00
/*
 * =====================================================================================
 *
 *       Filename:  map_func_select.h
 *
 *    Description:  当效率至关重要时,在map::operator[]与map::insert
 *      之间谨慎做出选择。
 *
 *        Version:  1.0
 *        Created:  中国北京标准时间:2008-7-18 11:13:49
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  Jyqi , foros_001@163.com
 *        Company:  iSoftStone
 *
 * =====================================================================================
 */
一、引言:
当向映射表中添加元素时,要优先选用insert, 而不是operator[];
而从效率和美学的观点考虑,结论是:当更新已经在映射表中的元素
的值时,要优先选择operator[]。 
二、示例:
//////////////////////////////////////////////////
//一个同时提供高效的添加和更新功能的模板函数
//
template<typename MapType,  //map的类型
 typename KeyArgType,  //KeyArgType类型参数
 typename ValueArgType>  //ValueArgType类型参数
typename MapType::iterator 
 efficientAddOrUpdate(MapType& m,
   const KeyArgType& k,
   const ValueArgType& v)
{
 typename MapType::iterator lb = //确定k在什么位置或应在什么位置;
  m.lower_bound(k);  
 if (lb != m.end() &&   //如果lb指向的pair的键与k等价,
   !(m.key_comp()(k, lb->first())) {
   lb->second = v; //则更新pair的值并返回指向该
   return lb; //pair的迭代器
   }
   else {
    typedef typename MapType::value_type MVT;
    return m.insert(lb, MVT(k, v)); //把pair<k, v>添加
       //到m中,并返回一个指向该新
       //元素的迭代器
    }
} 
三、总结:
当效率至关重要时,你应该在map::operator[]和map::insert之间仔细做出选择。
如果要更新一个已有的映射表元素,则应该优先选择operator[];但如果要添加一
个新的元素,那么最好还是选择insert。 
                    
                

                
            
        
浙公网安备 33010602011771号