如何检查copy_if是否在ostream_iterator的范围内返回true?
问题描述:
我希望能够检查std::copy_if()
的结果,看看是否有任何内容打印到std::cout
。如何检查copy_if是否在ostream_iterator的范围内返回true?
例如:
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所以...这似乎为我的拉姆达功能的工作,其中一个值被冷落
#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
在下面的例子中)可以记录如果要计算剩余值的数量,则可以用someOut
替代std::size_t countOut { 0U }
变量并将其增加(if (! ret) ++countOut;
)。
答
一个非常笨的非内置方式是将is_odd
包装在您自己的函数中,如果它返回true
,它将更新全局变量。
答
这是熟悉的: How to return value of std::copy in case of success or failure?。
你可以编写自己的输出迭代器,它包装了ostream_iterator
来计算已写入了多少个值。
是的,它好像是它的这个,或者使用临时数据结构来保持计数。 – Dillydill123
这通常被认为是危险的,因为类似is_odd的东西不应该有副作用。想象一下别人发现函数is_odd并想在代码的其他部分使用它。 – worenga
我所做的只不过是使函数对象的布尔部分成为函数对象的一部分,并在使用它的唯一函数内部声明了函数对象。这应该照顾到这个问题。我会看看你提出的另一种选择。谢谢 – Dillydill123