Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用ostream\u迭代器检查范围内的任何对象的copy\u if返回true?_C++_Algorithm_C++11_Stl - Fatal编程技术网

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中救了我。捕捉得好!