如何检查copy_if是否返回使用ostream_iterator范围内的任何内容

How to check if copy_if returned true for any in the range with ostream_iterator?

本文关键字:ostream iterator 范围内 任何内 返回 是否 何检查 检查 if copy      更新时间:2023-10-16

我希望能够检查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()的返回结果,但似乎并不有帮助。也许我应该使用其他算法?

谢谢。

您标记为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;
 }

如果要计算遗漏的值的数量,则可以用std::size_t countOut { 0U }变量替换someOut并在情况下增加IT(if ( ! ret ) ++countOut;)。

愚蠢的非构建方式是将is_odd包装在您自己的功能中,如果返回true,它将更新全局变量。

这很熟悉:如何在成功或失败的情况下返回std ::复制的值?

您可以编写自己的输出迭代器,该迭代器包装ostream_iterator来计算编写多少个值。