为什么std :: min_element和公司不专门用于std :: vector <bool>

时间:2017-06-08 13:02:56

标签: c++ algorithm vector boolean specialization

我有一个std::vector<bool>实例(例如foo),如果所有元素都是true,我需要编写一个返回true的函数。

我用

return *std::min_element(foo.begin(), foo.end());

实现这一目标,但这让我想到:如果容器包含至少一个false值,您知道最小元素是false。换句话说,您不需要遍历整个容器end(),这意味着std::min_element的专业化是合适的,就像std::vector<bool>的专业化一样合适的。

我错过了什么吗?或者这会被视为过早的优化?也许一个好的编译器无论如何都会解决它。

2 个答案:

答案 0 :(得分:8)

std::min_element无需专门std::vector<bool>。要获得所需的功能,您可以使用std::any_of,它将在第一次出现时停止。

return !std::any_of(foo.begin(), foo.end(), [](auto e){ return e == false; });

如果我们将std::all_of更改为Some programmer dude建议,那么您不需要否定返回值,这会给您

return std::all_of(foo.begin(), foo.end(), [](auto e){ return e; });

哪个更清洁,更容易理解。

答案 1 :(得分:5)

建议:使用std::any_of,其中:

  

如果pred为[first,last]范围内的任何元素返回true,则返回true,否则返回false。

意味着它会在找到false后立即返回。

示例:

// any_of example
#include <iostream>
#include <algorithm>    // std::any_of
#include <vector> 

int main () {
  std::vector<bool> foo = {true, true, true};

  if ( !std::any_of(foo.begin(), foo.end(), [](bool i){return i == false;}) )
      std::cout << "All elements are true\n";

  return 0;
}

输出:

All elements are true.

Live demo

由于您没有指定,因此std::min_element应遍历整个向量,因为它是一种通用方法。

专业化可以做你所说的,你可以利用它提供的compare功能。