如何不执行插入检查std :: map是否包含密钥?


Answers:


305

使用my_map.count( key ); 它只能返回0或1,这实际上是您想要的布尔结果。

也可以交替使用my_map.find( key ) != my_map.end()


40
@John:过早优化的后遗症。在GCC(我相信最合理的系统)上,map::count实现为find(__x) == end() ? 0 : 1;。因为multimap您可能会有性能方面的争论,但这不是OP的问题,我仍然更喜欢优雅。
Potatoswatter 2011年

42
不,过早的优化参数仅在优化需要付出一定努力的情况下才有效,而在这种情况下则不起作用。
markh44

13
不对。如果它使代码更易于阅读或消除不必要的开销,那还为时过早。在这种情况下,如果仍然通过find()实现count(),则调用find()可以直接消除函数调用... ergo,这是成熟的优化方法。我发现使用find()调用也更为明显,但这纯粹是个人喜好。
Tim Keating

9
在习惯使用库函数之前,先了解它们的性能并不是过早的优化。在这种情况下,您是对的,没关系,但是find和count之间的微小风格差异也没有。我认为您过分提倡“过早优化”。您应该采取任何“免费的”优化习惯,您可以找到它们并将其用于日常开发。正是在编码人员屈服于在可读性/开发时间/等方面付出代价的陷阱时,过早的优化措辞才成为正确的建议。
VoidStar

10
很远,std应该只添加一个该死的has(k)/ contains(k)像地球上其他所有健全的地图类一样。界面设计不佳。find()方法过于冗长,并且该count(k)方法绝对不是与语义平价的has(k)。就此而言,两者都不是find(k)。查看此问题的观看次数。
加罗德·史密斯

46

Potatoswatter的回答是可以的,但我更喜欢使用findlower_bound代替。lower_bound之所以特别有用,是因为如果您希望插入具有相同键的内容,则返回的迭代器随后可以用于提示插入。

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

这与他说的做事方式略有不同……唯一的区别是,value如果不需要插入,则可以跳过的计算。
Potatoswatter

1
当然,我知道OP不在乎插入,因此lower_bound基于解决方案的解决方案是过大的。我刚才提到我的回答是“为了完整性”。就像我说的那样,您的就足够了。:-)
克里斯·杰斯特·杨

4
是的,这是一个很好的答案,我没有不同意。只是指出与insert先验选择的关系。实际上,如果使用,则存在另一个差异multimap,该lower_bound方法将插入等效范围的开头,而普通insert方法将添加至范围的结尾。
Potatoswatter

2
不是问题的答案,而是我可怜的问题使我在这里找到正确的答案...我需要执行插入/更新。:D
Hunter-Orionnoir,2015年

1
@Hunter可以告诉我您的代码吗?如果不是很大,我可能会为您审查。
克里斯·杰斯特·杨

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.