2011-06-28 38 views
19

鑑於布爾值的容器(一個例子是std::vector<bool>),是否有一個返回true如果所有的值都true(「和」)的標準功能或true如果至少一個值是true(「或」),以短路評估?有什麼像「std :: and」或「std :: or」?

今天早上我挖了槽www.cplusplus.com但是找不到任何接近的東西。

+0

您可以輕鬆地實現自己的... – Dani

+8

@Dani:確實是這樣。但即使代碼很小,如果有什麼已經存在的,爲什麼我會重寫它? – ereOn

+0

@ereOn,容易實現的東西不會進入C++。如果你想嘗試c#甚至是一些解釋器。 – Dani

回答

37

您可以實現:

AND:

std::find(vector.begin(), vector.end(), false) == vector.end() // all the values are true 

OR:

std::find(vector.begin(), vector.end(), true) != vector.end() //at least one value is true 
+1

嗯,有時候我猜我太努力了......如果我需要對值進行更復雜的檢查,我甚至可以將'find_if'與函數對象一起使用。非常感謝你 ! – ereOn

+3

+1這很聰明! – fredoverflow

+0

我接受了FredOverflow的答案,因爲他的解決方案更直接。 Upvoted這個公平,因爲它真的很聰明。 – ereOn

10

可以使用函數對象logical_andlogical_or連同還原做到這一點。

accumulate計算出減少量。因此:

bool any = std::accumulate(foo.begin(), foo.end(), false, std::logical_or); 
bool all = std::accumulate(foo.begin(), foo.end(), true, std::logical_and); 

警告:這是使用短路(該accumulate功能一無所知短路即使函子做的),而伊戈爾的聰明解決方案。

+1

如何減少'std :: accumulate'? – ltjax

+1

@ltjax Duh [...](http://example.com) –

+0

+1。我不知道這些功能。謝謝。 – ereOn

43

是那裏,如果所有的值都爲真( 「和」),則返回true的標準功能

std::all_of(vec.begin(), vec.end(), [](bool x) { return x; }) 

或者如果至少一個值是真( 「或」)

std::any_of(vec.begin(), vec.end(), [](bool x) { return x; }) 

與短路evalutation?

我剛插入打印語句到lambda中,是的,兩個函數都執行短路。

+0

+1。我知道這會在某天添加。不幸的是我現在不能在我的項目中使用C++ 0x,但這很好理解。謝謝。 – ereOn

+1

@ereOn:我也不能(在工作),所以我繼續創建它們(當然不是在命名空間std中)以幫助未來的遷移:) –

+0

as @Morwenn表示缺少一元謂詞 –

1

如果您不需要爲不同的容器類型的通用算法...

當你正在尋找短路的評價,你可以給的std :: valarray的機會。對於and使用valarray::min() == true對於or,您可以使用Igor提到的std::find

如果您知道的元素數在編譯時存儲,你甚至可以用std :: bitset的:

bitset<100> container(); 

//... fill bitset 

bool or = container.any(); 
bool and = container.count() == container.size(); 
相關問題