std :: set :: find的可读替代方法

时间:2011-03-15 07:05:53

标签: c++ boost stl

通常我不关心集合中项目的价值,我只关心它是否存在。反复写if (s.find(val) == s.end())是漫长,丑陋和不易读的。

是否有一种看起来像if (contains(s,val))的好方法,这有点标准(stl,boost)。

适用于地图的解决方案的奖励点。

是的,我知道我可以

#define has(X,Y) (X).find(Y) != (X).end()
template<T,U> inline bool has(T s,U elt) {return s.find(elt) != s.end();}

但我宁愿使用最佳实践而不是重新发明许多小型实用程序。

2 个答案:

答案 0 :(得分:4)

如果您的担忧主要是简洁,那么我建议:

if (s.count(val)) {
  // count == 1 == true, element exists
} else {
  // count == 0 == false, element does not exist
}

但就我个人而言,我仍然更喜欢检查查找结果,因为意图更明确。对我来说值得多点打字。

答案 1 :(得分:2)

if (s.find(val) == s.end())是检查项目是否存在于容器中的“标准”方式。据我所知,Boost或标准库都没有提供任何类型的函数来返回表示元素是否存在于容器中的bool。

如果你想这样做,你必须自己实现它。标准库或Boost提供看起来不同的现有功能是没有意义的。

如果您想这样做,模板化实现将是最佳解决方案。在C ++中使用定义通常不是一个好主意。