为什么 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.
由于您没有指定 data-structure 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; });
哪个更清晰,更容易理解。
我有一个 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
.
示例:
// 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 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; });
哪个更清晰,更容易理解。