2017-06-08 42 views
3

我有一个std::vector<bool>实例(foo,说),我需要写一个返回true如果所有元素都true功能。为什么的std :: min_element和公司没有专门针对性病::矢量<bool>

我用

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

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

我错过了什么?或者这会被视为过早优化?无论如何,一个好的编译器可能会把它整理出来。

+0

这似乎更适合['std :: all_of'](http://en.cppreference.com/w/cpp/algorithm/all_any_none_of)。 –

+0

为什么不使用bitset? –

+3

为什么不使用内置短路的'std :: any_of'? – NathanOliver

回答

8

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

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

如果我们将其更改为std::all_ofSome programmer dude建议,那么你并不需要否定的返回值,它给你

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

这是一个小更清洁和更容易理解。

+0

我想我需要返回'!std :: any_of ...' –

+0

@PaulLogue正确。如果发现“false”,你想返回false。 – NathanOliver

+1

@gsamaras不,从第一次'返回i == true'是false,那么函数将通过返回false而退出。 – NathanOliver

5

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

,则返回true,如果预解码值返回为任何在范围[第一个,最后的元件的真),否则为假。

这意味着一旦发现它会返回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. 

Live demo


既然你没有到位指定这样做,那么std::min_element应该THR迭代尽管整个矢量,因为这是一个通用的方法。

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

+1

使用'auto'让大家快乐 –

相关问题