繁体   English   中英

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

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

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

我用

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

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

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

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

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

如果我们将此更改为std::all_of因为某些程序员家伙建议那么你不需要否定返回值,这会给你

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

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

建议:使用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.

现场演示


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM