C++ std::set::find的可读替代方案

C++ std::set::find的可读替代方案,c++,boost,stl,C++,Boost,Stl,通常我不关心集合中项目的值,我只关心它是否存在。如果s.findval==s.end冗长、难看且可读性较差,则重复写入 有没有一种很好的方法,看起来像是if containss,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.findval==s.end冗长、难看且可读性较差,则重复写入

有没有一种很好的方法,看起来像是if containss,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();}

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

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

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

但就我个人而言,我仍然更喜欢对照结束检查find,因为其意图更为明确。对我来说,额外键入一点内容是值得的。

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

if (s.count(val)) {
  // count == 1 == true, element exists
} else {
  // count == 0 == false, element does not exist
}
但就我个人而言,我仍然更喜欢对照结束检查find,因为其意图更为明确。对我来说,额外键入一点是值得的。

如果s.findval==s.end是检查容器中是否存在项目的“标准”方法。据我所知,Boost或标准库都不提供任何类型的函数,返回bool,指示容器中是否存在元素

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

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

如果S.FunVals= S.Enter是检查容器中是否存在项的“标准”方式。据我所知,Boost或标准库都不提供任何类型的函数,返回bool,指示容器中是否存在元素

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


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

可读性,我仍然使用0=S.CONTVALL,来减少下一个读者的惊奇因素,嗯?计数返回布尔?。另外,它不适用于地图。但是很好,很有创意+1是的,但是如果您要写出s.countval==0,那么您最好跳出额外的五次击键并使用find/end。另外,它对映射也很好——有一个std::map::count方法。我知道,这就是为什么它对我来说不是最好的方法。当然,std::map::count是存在的,对不起。为了可读性,我仍然使用0==s.countval,以减少下一个阅读器的意外因素,是吗?计数返回布尔?。另外,它不适用于地图。但是很好,很有创意+1是的,但是如果您要写出s.countval==0,那么您最好跳出额外的五次击键并使用find/end。另外,它对映射也很好——有一个std::map::count方法。我知道,这就是为什么它对我来说不是最好的方法。当然,std::map::count是存在的,对不起。@Daupic,我不想这么说,但对于标准库或Boost来说,提供看起来不同的现有功能是没有意义的。真的是假的。为什么vector.find不是std::find的特化?每辆车怎么办?实际上,可读性的全部要点是以简洁易读的方式实现现有功能。编写代码供您阅读,而不是供计算机执行…std::vector没有查找功能。BOOST_FOREACH的目的是减少繁琐的样板代码,而不一定是为了使其更易于阅读,尽管这是一种副作用;如果不使用typedefs,通常可以使用长度超过120个字符的迭代器类型。将返回的迭代器与结束迭代器进行比较并不难理解,这是检查容器中是否存在元素的标准方法。在没有给出任何思想的情况下,任何C++开发者都应该知道这个代码到底在做什么。变量名也可以长。请解释一下为什么BOOST_FOREACH被认为是样板减速机,而containsx,y不是。两者都做同样的事情,少输入,让你的代码看起来更像英语。抱歉,事实上vector没有find,但是map有,并且可以通过find上的专门化来实现。空的和size==0的呢?它只是更具可读性。那么map::operator[]呢,它相当于*this->insertmake\u pairx,T.first.second。我相信我能找到更多类似的例子。@dauphic,哦,用STL迭代对象的标准方法是auto-ito.begin;它=o、 结束++它是每个使用STL的人都应该熟悉的,但是,为了简洁/可读性,我们需要BOOST_FOREACH。@Elazar:这是C++0x,更好的方法是内置BOOST_FOREACH的范围。@Daupic,我不想这么说,但是,对于标准库或Boost来说,提供看起来完全不同的现有功能是没有意义的。真的是假的。为什么vector.find不是std::find的特化?什么ab
每辆车都出去吗?实际上,可读性的全部要点是以简洁易读的方式实现现有功能。编写代码供您阅读,而不是供计算机执行…std::vector没有查找功能。BOOST_FOREACH的目的是减少繁琐的样板代码,而不一定是为了使其更易于阅读,尽管这是一种副作用;如果不使用typedefs,通常可以使用长度超过120个字符的迭代器类型。将返回的迭代器与结束迭代器进行比较并不难理解,这是检查容器中是否存在元素的标准方法。在没有给出任何思想的情况下,任何C++开发者都应该知道这个代码到底在做什么。变量名也可以长。请解释一下为什么BOOST_FOREACH被认为是样板减速机,而containsx,y不是。两者都做同样的事情,少输入,让你的代码看起来更像英语。抱歉,事实上vector没有find,但是map有,并且可以通过find上的专门化来实现。空的和size==0的呢?它只是更具可读性。那么map::operator[]呢,它相当于*this->insertmake\u pairx,T.first.second。我相信我能找到更多类似的例子。@dauphic,哦,用STL迭代对象的标准方法是auto-ito.begin;它=o、 结束++它是每个使用STL的人都应该熟悉的,但是,为了简洁/可读性,我们需要BOOST_FOREACH。@Elazar:这是C++0x,更好的方法是内置BOOST_FOREACH的范围。Adhemar对STL容器为什么不包含contains@Patrick谢谢但标题有误导性。为什么它难看?任何C++程序员都可以阅读和理解它。这本身就是一个很好的实践,不管某人的个人信仰和宗教信仰如何。为什么你关心一个非C++编程人员是否能理解你的C++代码?@ Lundin,C++程序员≠ STL程序员。总之,英语box.containsitem比STL习语更常见。最后也是最重要的一点,它非常长,并且重复容器名称两次,这为您提供了另一个出错的位置。findx!=ELAZAR STL自1995,何时成为C++的一部分?除此之外,我见过的一些最可怕的程序是由试图用自己的宏重新发明编程语言的人编写的。这与说我不喜欢英语单词编程几乎是一样的,它是一个很长的单词,不适合描述我所做的事情。从今以后,我将改用编码这个词,因为它显然更适合。如果没有人理解wtf我不再说了,他们应该学习我自己正确的英语版本contains@Patrick,谢谢,但标题有误导性。为什么它难看?任何C++程序员都可以阅读和理解它。这本身就是一个很好的实践,不管某人的个人信仰和宗教信仰如何。为什么你关心一个非C++编程人员是否能理解你的C++代码?@ Lundin,C++程序员≠ STL程序员。总之,英语box.containsitem比STL习语更常见。最后也是最重要的一点,它非常长,并且重复容器名称两次,这为您提供了另一个出错的位置。findx!=ELAZAR STL自1995,何时成为C++的一部分?除此之外,我见过的一些最可怕的程序是由试图用自己的宏重新发明编程语言的人编写的。这与说我不喜欢英语单词编程几乎是一样的,它是一个很长的单词,不适合描述我所做的事情。从今以后,我将改用编码这个词,因为它显然更适合。如果没有人理解我说的wtf,他们应该学习我自己正确的英语版本。