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

Why is std::min_element and company not specialized for std::vector<bool>

我有一个 std::vector<bool> 实例(比方说 foo),如果所有元素都是 [=16],我需要编写一个 returns true 的函数=].

我用

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

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

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

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

Returns true if pred returns true for any of the elements in the range [first,last), and false otherwise.

表示一旦找到false.

就会return

示例:

// 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


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

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

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

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

如果我们按照 Some programmer dude 的建议将其更改为 std::all_of,那么您无需取反 return 值,这样您就可以得到

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

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