2017-06-08 39 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'讓大家快樂 –

相關問題