如何使用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?的主要内容,如果未能解决你的问题,请参考以下文章