![](/img/trans.png)
[英]std::min_element with std::vector<Eigen::Vector2f>
[英]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.