使用std :: all_of()和std:none_of()的空容器的好习惯用法?

时间:2013-03-21 18:22:09

标签: c++ c++11 stl-algorithm

对于空容器,std :: all_of()和std:none_of()都返回true。

除了辩论这个概念方面之外,有人可以建议一个不要求总是检查容器是否为空并且检查all_of或none_of的成语吗?

这很麻烦,因为在空容器上的两个算法中使用相同的谓词将表明谓词对于ALL和NONE都是正确的。所以,你的(空)向量是all_of“odd”,all_of“even”,none_of“odd”和none_of“even”。

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

2 个答案:

答案 0 :(得分:13)

  

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

这就是std::any_of()为空集合返回false的原因。

如果问题是“是否所有项目已完成处理?”,则预期答案将为“是,一切都已完成”。如果首先没有任何项目需要处理(那是std::all_of()案例)。

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

答案 1 :(得分: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 );
}