如何使用ostream_iterator检查copy_if是不是为范围内的任何内容返回true?

Posted

技术标签:

【中文标题】如何使用ostream_iterator检查copy_if是不是为范围内的任何内容返回true?【英文标题】:How to check if copy_if returned true for any in the range with ostream_iterator?如何使用ostream_iterator检查copy_if是否为范围内的任何内容返回true? 【发布时间】:2017-02-18 07:16:44 【问题描述】:

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

谢谢。

【问题讨论】:

【参考方案1】:

您将 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;)。

【讨论】:

【参考方案2】:

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

【讨论】:

是的,看起来要么是这样,要么使用临时数据结构来保持计数。 这通常被认为是危险的,因为像 is_odd 这样的东西不应该有副作用。想象一下,其他人发现了函数 is_odd 并想在代码的其他部分使用它。 我所做的只是将 bool 作为函数对象的一部分,并在唯一使用它的函数中声明函数对象。那应该解决这个问题。我会看看你提出的另一个选项。谢谢 @Dillydill123 请注意,copy_if 是通过复制而不是通过引用来获取谓词的。确保它可以处理这个(最简单的方法是使用 lambda,通过引用捕获一些东西) 你刚刚把我从一个令人作呕的错误中救了出来。不错的收获!【参考方案3】:

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

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

【讨论】:

以上是关于如何使用ostream_iterator检查copy_if是不是为范围内的任何内容返回true?的主要内容,如果未能解决你的问题,请参考以下文章

使用 * 分配给 ostream_iterators

如何使 fx cop 警告 CS0067 静音?

c++之iostream迭代器用法超详细整理!!!

cop2000使用收获

COP 1000 Project

如何也使用 where 条件从表中获取列名