如何检查copy_if是否返回使用ostream_iterator范围内的任何内容
How to check if copy_if returned true for any in the range with ostream_iterator?
我希望能够检查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 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;
}
如果要计算遗漏的值的数量,则可以用std::size_t countOut { 0U }
变量替换someOut
并在情况下增加IT(if ( ! ret ) ++countOut;
)。
愚蠢的非构建方式是将is_odd
包装在您自己的功能中,如果返回true
,它将更新全局变量。
这很熟悉:如何在成功或失败的情况下返回std ::复制的值?
您可以编写自己的输出迭代器,该迭代器包装ostream_iterator
来计算编写多少个值。
相关文章:
- ostream过载时的缓冲区冲洗
- 需要从 istream 和 ostream 派生 iostream
- "ostream &os"有什么用?
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 在调试模式下引发C++ "deque iterator not dereferencable"异常
- std::iterator::reference 必须是引用吗?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++表达SFINAE和ostream操纵器
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 逗号在重载 ostream 和 istream 在结构中分开
- 为什么unordered_set<string::iterator>不起作用?
- 为什么 Clang std::ostream 写一个 std::istream 无法读取的双精度?
- ostream 运算符<< 为获取 STL 容器而过载,传递 std::string 会破坏它?
- 将 ostream 包装在类中并模板化<<运算符
- 如何在C++中编写 ostream 的向量,它接收所有不同的输出流,如 cout、ostringstream 和 ofs
- 为什么在返回 ostream 类时使用引用?
- 将标准输出重定向到ostream
- boost::interprocess::file_lock 与 std::ostream 一起使用时的错误行为
- ostream<<Iterator, C++