2010-10-07 43 views
107

我发现检查重复的唯一方法是插入并检查std::pair.secondfalse,但问题是,如果密钥未使用,它仍会插入某些内容,而我想要的是map.contains(key);函数。如何检查std :: map是否包含没有插入的键?

+3

可能重复[如何找到一个给定的键在C++的std ::地图存在(http://stackoverflow.com/questions/1939953/how-to-find-if-a-given -key-exists-in-ac-stdmap) – OrangeDog 2014-07-24 12:34:04

回答

231

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

或者my_map.find(key) != my_map.end()也可以。

+5

-1:应该使用'find'。对于映射和多映射,它至少与'count'一样高效,并且当您考虑对发现的键进行更改的典型需求时效率更高。 – 2011-06-03 14:26:04

+29

@John:那种不成熟的优化。在GCC上(我确定最合理的系统),'map :: count'实现为'find(__ x)== end()? 0:1;'。对于'multimap'你可能会有一个表现的争论,但这不是OP的问题,我仍然更喜欢优雅。 – Potatoswatter 2011-06-03 23:09:21

+24

不,过早优化参数仅在优化需要花费一些努力时才有效,在这种情况下优化不需要。 – markh44 2011-11-10 10:21:02

39

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 
} 
+0

这与他有着微妙的不同说他正在这样做......唯一的区别是,如果插入是不必要的,可以跳过'value'的计算。 – Potatoswatter 2010-10-07 23:23:28

+0

当然,我知道OP不在意插入,所以基于'lower_bound'的解决方案是矫枉过正的。我刚才提到我的答案是“完整性”;就像我说的那样,你完全够了。 :-) – 2010-10-07 23:29:56

+3

是的,这是一个很好的答案,我不反对任何事情。只是指出与先验“插入”的替代关系。实际上,如果使用'multimap'还有另一个区别,'lower_bound'方法会在等效范围的开始处插入,而普通的'insert'方法会添加到范围的末尾。 – Potatoswatter 2010-10-07 23:35:58