2017-02-18 98 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

相关问题