如何检查copy_if是否为ostream_iterator范围内的任何一个返回true?

时间:2017-02-18 07:16:45

标签: c++ algorithm c++11 stl

我希望能够检查std::copy_if()的结果,看看是否有任何内容已打印到std::cout

例如:

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()的返回结果,但它似乎没有用。也许我应该使用不同的算法?

感谢。

3 个答案:

答案 0 :(得分:2)

你标记了C ++ 11所以...在我看来是一个lambda函数的工作,其中外部变量(以下示例中为someOut)可以记录是否遗漏了值

#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替换为std::size_t countOut { 0U }变量,并在该情况下将其递增(if ( ! ret ) ++countOut;)。

答案 1 :(得分:0)

一种愚蠢的非内置方式是将is_odd包装在您自己的函数中,如果它返回true,它将更新全局变量。

答案 2 :(得分:0)

这是熟悉的: How to return value of std::copy in case of success or failure?

您可以编写自己的输出迭代器来包装ostream_iterator以计算已写入的值。