C++ 如何使用ostream\u迭代器检查范围内的任何对象的copy\u if返回true?
我希望能够检查C++ 如何使用ostream\u迭代器检查范围内的任何对象的copy\u if返回true?,c++,algorithm,c++11,stl,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_
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());
向量向量{1,2,3,4,5,6,7};
结构是奇数{
布尔运算符()(int-val)
返回值%2==1;
};
复制if(vec.begin(),vec.end(),ostream_迭代器{cout},
是奇数;
有没有办法检查是否打印了任何内容?我尝试查看std::copy_if()
的返回结果,但似乎没有帮助。也许我应该使用不同的算法
谢谢。一种愚蠢的非内置方法是在您自己的函数中包装
is\u odd
,如果它返回true则会更新全局变量,这是您熟悉的:
您可以编写自己的输出迭代器来包装ostream\u迭代器
,以计算已写入的值的数量。您标记了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;
}
#包括
#包括
#包括
#包括
int main()
{
bool someOut{false};
向量向量{1,2,3,4,5,6,7};
std::copy_if(vec.begin(),vec.end(),
std::ostream_迭代器{std::cout},
[&](int-val){bool-ret{val%2==1};
如果(!ret)someOut=true;
返回ret;});
是的,看起来不是这样,就是使用一个临时数据结构来计数。这通常被认为是危险的,因为类似is_odd的东西不应该有副作用。想象一下,其他人发现这个函数是_odd的,并希望在代码的其他部分使用它。我所做的是将函数的bool部分改为在对象上,并在使用它的唯一函数中声明函数对象。这应该可以解决该问题。我将查看您提供的另一个选项。Thanks@Dillydill123请注意,copy_if通过复制而不是引用获取谓词。请确保它可以处理此问题(最简单的方法是使用lambda,通过引用捕获某些内容)您刚刚从一个恶心的bug中救了我。捕捉得好!