2013-03-21 69 views
2

对于空容器,std :: all_of()和std:none_of()都返回true。std :: all_of()和std:none_of()的空容器的好习语?

除了辩论这个概念方面,有人可以提出一个不要求总是检查容器是否为空并检查all_of或none_of的习惯用法吗?

这很麻烦,因为在两个算法中对一个空容器使用相同的谓词将指示谓词对于元素的ALL和NONE均为真。所以,你的(空)矢量是all_of“odd”,all_of“even”,none_of“odd”和none_of“even”。

在一个更实用的层面上,我正在考虑检查某个状态项的集合,就像任何“准备好处理”一样,并且期望一个空集合对应于“否,没有元素准备好被处理“。我知道我可以检查它是否是空的,但我正在寻找其他可能性。

+2

有什么问题?即使你对(auto&e:range)进程(e)有'if(all_of(range,ready_for_processing))',那也没关系。 – ipc 2013-03-21 18:40:21

+2

如果none_of对于空容器上的“准备处理”谓词产生true,这对我来说似乎是正确的答案。 – 2013-03-21 18:43:38

+0

'all_of'是“对于S中的所有x,P(x)”。 'none_of'是“S,!P(x)”中的所有x。 “any_of”是“S中存在x,P(x)”。 'all_of'和'none_of'不是相互否定的 - 对于S中所有的x,'!'“,P(x)”是“存在x,!P(x)”(又名'any_of(... ,!P)'),'!none_of(...)'是'any_of(...)'。 – Yakk 2013-03-21 19:38:36

回答

2

你可以写自己的包装和使用,如果容器是空的修改结果:

// in your namespace, not std: 
template< class InputIt, class UnaryPredicate > 
bool none_of(InputIt first, InputIt last, UnaryPredicate p) 
{ 
    return first != last && std::none_of(first, last, p); 
} 
+0

谢谢。这是我所要求的。 – Arbalest 2013-03-21 20:09:49

12

在一个更实际的层面,我在检查项目的集合A的角度思考状态,就像任何“准备处理”一样,并且期望一个空集合对应于“不,没有准备好要处理的元素”。

这就是为什么std::any_of()确实返回false为空集合。

如果问题是“是否全部项目完成处理?”,那么预期的答案将是“是的,一切都已完成”。如果没有任何项目需要处理的话(这就是std::all_of()的情况)。

同样,问题“在处理期间没有发生错误?”会回答“是的,没有错误。”为一个空列表(没有工作 - >没有错误)。这是std::none_of()检查的内容。