【问题标题】: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() 的返回结果,但似乎没有帮助。也许我应该使用不同的算法?

谢谢。

【问题讨论】:

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


    【解决方案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 以计算已写入的值的数量。

      【讨论】:

        猜你喜欢
        • 2011-05-22
        • 2010-09-17
        • 2021-07-16
        • 2011-03-13
        • 2011-11-26
        • 2021-05-08
        • 1970-01-01
        • 2018-11-10
        • 1970-01-01
        相关资源
        最近更新 更多