2017-02-18 43 views
2

我希望能夠檢查std::copy_if()的結果,看看是否有任何內容打印到std::cout如何檢查copy_if是否在ostream_iterator的範圍內返回true?

例如:

vector<int> vec {1, 2, 3, 4, 5, 6, 7}; 

struct is_odd { 
    bool operator()(int val) 
    return val % 2 == 1; 
}; 

copy_if(vec.begin(), vec.end(), ostream_iterator<int>{cout}, 
     is_odd()); 

有沒有一種方法可以檢查是否打印什麼?我試圖看看std::copy_if()的返回結果,但它似乎沒有幫助。也許我應該使用不同的算法?

謝謝。

回答

2

您標記C++ 11所以...這似乎爲我的拉姆達功能的工作,其中一個值被冷落

#include <vector> 
#include <iostream> 
#include <iterator> 
#include <algorithm> 

int main() 
{ 
    bool someOut { false }; 

    std::vector<int> vec {1, 2, 3, 4, 5, 6, 7}; 

    std::copy_if(vec.begin(), vec.end(), 
       std::ostream_iterator<int>{std::cout}, 
       [&](int val) { bool ret { val % 2 == 1 }; 
           if (! ret) someOut = true; 
           return ret; }); 

    std::cout << std::endl << someOut << std::endl; 
} 

外部變量(someOut在下面的例子中)可以記錄如果要計算剩餘值的數量,則可以用someOut替代std::size_t countOut { 0U }變量並將其增加(if (! ret) ++countOut;)。

0

一個非常笨的非內置方式是將is_odd包裝在您自己的函數中,如果它返回true,它將更新全局變量。

+0

是的,它好像是它的這個,或者使用臨時數據結構來保持計數。 – Dillydill123

+0

這通常被認爲是危險的,因爲類似is_odd的東西不應該有副作用。想象一下別人發現函數is_odd並想在代碼的其他部分使用它。 – worenga

+0

我所做的只不過是使函數對象的布爾部分成爲函數對象的一部分,並在使用它的唯一函數內部聲明瞭函數對象。這應該照顧到這個問題。我會看看你提出的另一種選擇。謝謝 – Dillydill123

相關問題