【发布时间】:2011-07-15 13:49:48
【问题描述】:
通常我不关心集合中物品的价值,我只关心它是否存在。而且反复写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();}
但我宁愿使用最佳实践,也不愿重新发明许多小型实用程序。
【问题讨论】:
-
复制stackoverflow.com/questions/1701067/…,Adhemar 对为什么 stl 容器不包含 contains() 有一个有趣的看法
-
@Patrick,谢谢,这里的标题有误导性。
-
为什么丑?任何 C++ 程序员都可以阅读和理解它。仅此一项就成为一种很好的实践,无论某人的个人、宗教信仰如何看待编码风格。为什么你担心一个非 C++ 编程的人是否能理解你的 C++ 代码?
-
@Lundin,C++ 程序员≠ STL 程序员。无论如何,英语 (
box.contains(item)) 比 STL 习语更常见。最后也是最重要的一点,它很长并且重复了两次容器的名称,这给了你另一个错误的地方(u.find(x) != v.end())。 -
@Elazar STL 自 1995 年以来一直是 C++ 的一部分?除此之外,我见过的一些最可怕的程序是由试图用自己的宏重新发明一种编程语言的人编写的。这与说“我不喜欢英语单词 programming 几乎是一回事,它是一个很长的词,并不适合描述我所做的事情。以后我将使用换成encoding这个词,因为它显然更适合。如果没有人理解我就不多说了,他们应该学习我自己的正确英语版本。”