我有一个std::vector<bool>
实例(例如foo
),如果所有元素都是true
,我需要编写一个返回true
的函数。
我用
return *std::min_element(foo.begin(), foo.end());
实现这一目标,但这让我想到:如果容器包含至少一个false
值,您知道最小元素是false
。换句话说,您不需要遍历整个容器end()
,这意味着std::min_element
的专业化是合适的,就像std::vector<bool>
的专业化一样合适的。
我错过了什么吗?或者这会被视为过早的优化?也许一个好的编译器无论如何都会解决它。
答案 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.
由于您没有指定data-structure,因此std::min_element
应遍历整个向量,因为它是一种通用方法。
专业化可以做你所说的,你可以利用它提供的compare
功能。