我有一个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?
答案 0 :(得分:7)
第二段代码没有问题。如果找不到密钥,则[]
将插入一个初始值为value的对象(在本例中为double
,其值为零),并返回对该值的引用。因此,在这种情况下,map[key] += value
与map[key] = value
具有相同的效果。
更一般地说,调用find
然后检查结果几乎肯定更有效,而不是调用at
并捕获异常。异常处理实现通常假设异常仅在特殊情况下抛出,并以异常为代价优化通常情况。
当然,速度很重要,那么你需要对它进行测量才能确定。
答案 1 :(得分:2)
你不能用operator[]
来做,但你可以使用insert
方法:它返回迭代器和bool,指示返回的迭代器是指向先前存在的元素还是新插入的元素
此外,原始类型默认初始化为零。