C++ 加速std::map和boost:unordered_map[]操作

C++ 加速std::map和boost:unordered_map[]操作,c++,stl,map,C++,Stl,Map,我有一个可选类型为std::MAP和可选类型为unordered_MAP(根据typdef MAP)的映射,以及一个向给定键控值添加值的函数: func1(MAP<string, double> &map, string &key, double &val2add){ try { map.at(key) += val2add; }catch(out_of_range& oor){ map[key] =

我有一个可选类型为std::MAP和可选类型为unordered_MAP(根据typdef MAP)的映射,以及一个向给定键控值添加值的函数:

  func1(MAP<string,  double>  &map, string  &key, double &val2add){
    try
{
      map.at(key)  += val2add;
}catch(out_of_range& oor){
          map[key] = val2add; // in case map[key] didn't exist before. 
    }
  }
func1(映射和映射、字符串和键、双精度和val2add){
尝试
{
map.at(key)+=val2add;
}渔获物(超出范围和出海){
map[key]=val2add;//以防map[key]以前不存在。
}
}
问题是,这意味着比简单的工作要加倍(甚至可能更多)

  func2(MAP<string,  double>  &map, string  &key, double &val2add){
       map[key] += val2add; // if map[key] doesn't exist - problem
  }
func2(映射和映射、字符串和键、双精度和val2add){
map[key]+=val2add;//如果map[key]不存在-问题
}
但上述方法不起作用,因为据我所知,[]操作符使用已定义的键和默认的双精度值初始化map中的新对象。如果我知道默认的double值是0,那么func2仍然可以达到我想要的效果-但我不能依赖于此


那么,有没有比func1更好地使用[]的方法呢?

第二段代码没有问题。如果找不到键,则
[]
将插入一个值初始化对象(在本例中,是一个值为零的
双精度
),并返回对该对象的引用。因此,在这种情况下,
map[key]+=value
map[key]=value
具有相同的效果

更一般地说,调用
查找
然后检查结果几乎肯定比在处调用
并捕获异常更有效。异常处理实现通常假定只有在异常情况下才会抛出异常,并以异常为代价优化通常情况


当然,它的速度很重要,然后您需要测量它以确定。

您不能使用
操作符[]
,但您可以使用
插入方法:它返回迭代器和bool,指示返回的迭代器是指向以前存在的元素还是新插入的元素


此外,原语类型默认初始化为零。

我想我不能依赖默认的int,double值?我错了吗?@dan12345 double的默认值是0.0,这就是你想要的。(这与未初始化的变量非常不同,您确实无法依赖这些变量)@dan12345:您通常可以依赖标准容器来插入初始化的值,而不是未初始化的值。当然,
operator[]
的定义指定“如果映射中没有与
x
等价的键,则将
value\u type(x,T())
插入映射。”我不明白您的问题是什么<代码>运算符[]
对于
std::map
std::unordered_map
而言,如果密钥不存在,则保证为该密钥创建一个具有值初始化值的条目。每个基本类型值都初始化为0。不,基本类型的值初始化为0。默认初始化使它们未初始化。