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

时间:2012-02-20 12:25:37

标签: c++ stl map

我有一个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] = val2add; // in case map[key] didn't exist before. 
    }
  }

问题是这意味着双重(甚至可能更多)工作而不仅仅是

  func2(MAP<string,  double>  &map, string  &key, double &val2add){
       map[key] += val2add; // if map[key] doesn't exist - problem
  }

但是上面的代码不起作用,因为据我所知,[]运算符使用定义的键和默认的double值在map中初始化一个新对象。如果我知道默认的double值是0,那么func2仍然可以实现我想要的 - 但我不能依赖它。

那么有没有办法以更好的方式使用[]而不是func1?

2 个答案:

答案 0 :(得分:7)

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

更一般地说,调用find然后检查结果几乎肯定更有效,而不是调用at并捕获异常。异常处理实现通常假设异常仅在特殊情况下抛出,并以异常为代价优化通常情况。

当然,速度很重要,那么你需要对它进行测量才能确定。

答案 1 :(得分:2)

你不能用operator[]来做,但你可以使用insert方法:它返回迭代器和bool,指示返回的迭代器是指向先前存在的元素还是新插入的元素

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