将remove_copy_if与ostream_iterator一起使用时确定复制范围的结束
Determine end of copied range when using remove_copy_if with ostream_iterator
我正在尝试使用remove_copy_if将iterable
直接复制到stdout
ostream_iterator。remove_copy_if
保证return value
是输出范围末端的iterator
。此返回值可用于通过找出输出迭代器的开始和返回迭代器之间的距离来确定复制到目标的元素的数量。这在使用容器时是有意义的,但是如果它是ostream_iterator
,如何使用相同的功能来确定复制到目标的元素的数量。
以下示例应该对我可能想要实现的目标更有意义
#include<vector>
#include<iterator>
#include<algorithm>
#include<functional>
#include<iostream>
#include <time.h>
using namespace std;
int main() {
int rawdata[] = {1,2,3,4,5,6,7,8,9,10,11};
vector<int> data(20);
vector<int>::iterator curr = remove_copy_if(rawdata,rawdata + sizeof(rawdata)/sizeof(rawdata[0]),data.begin(),bind2nd(greater<int>(),10));
wcout<<L"No of data copied = "<<curr - data.begin()<<endl;
for(int i=0;i<10;i++) {
int some_value = rand()%20 + 1;
ostream_iterator<int> curr = remove_copy_if(data.begin(),data.end(),ostream_iterator<int>(cout),bind2nd(less<int>(),some_value));
//if (curr - what???? > 0)
cout<<endl;
}
return 0;
}
我遇到了以下非线程安全,不是那么优雅的解决方案来完成这项工作。
#include<vector>
#include<iterator>
#include<algorithm>
#include<functional>
#include<iostream>
#include <time.h>
#include <algorithm>
using namespace std;
template<class _Fn1>
class counter
: public std::unary_function<typename _Fn1::argument_type, bool>
{
public:
explicit counter(const _Fn1& _Func)
: _Functor(_Func) {
count = countTrue = countFalse = 0;
}
bool operator()(const typename _Fn1::argument_type& _Left) const
{
count++;
if (_Functor(_Left)) {
countTrue++;
return true;
} else {
countFalse++;
return false;
}
}
static int count, countTrue,countFalse;
protected:
_Fn1 _Functor; // the functor to apply
};
template<class _Fn1>
int counter<_Fn1>::count=0,counter<_Fn1>::countTrue=0,counter<_Fn1>::countFalse=0;
int main() {
int rawdata[] = {1,2,3,4,5,6,7,8,9,10,11};
vector<int> data(20);
vector<int>::iterator curr = remove_copy_if(rawdata,rawdata + sizeof(rawdata)/sizeof(rawdata[0]),data.begin(),bind2nd(greater<int>(),10));
wcout<<L"No of data copied = "<<curr - data.begin()<<endl;
for(int i=0;i<10;i++) {
int some_value = rand()%20 + 1;
ostream_iterator<int> curr = remove_copy_if(data.begin(),data.end(),ostream_iterator<int>(cout),counter<binder2nd<less<int>>>(bind2nd(less<int>(),some_value)));
if (counter<binder2nd<less<int>>>::countFalse) {
cout<<endl<<"No of data printed = "<<counter<binder2nd<less<int>>>::countFalse<<endl;
}
}
return 0;
}
相关文章:
- C++11:没有复制构造函数的自定义基于范围的循环
- 基于C++范围的循环,容器是否被复制
- 基于范围的 std::move 调用意外复制构造函数
- 如何在块复制期间矢量化范围检查
- 将迭代器范围复制到矢量而不重复
- 删除复制构造函数和运算符=类范围访问
- 如何将字符的范围从字符数组复制到矢量
- C 11矢量构造函数复制与范围
- 将remove_copy_if与ostream_iterator一起使用时确定复制范围的结束
- 对于不可复制类型的范围循环,是否可能
- 在不复制的情况下构建范围内的向量
- 复制范围中的优化
- 为什么 std::copy 抛出错误向量迭代器 + 偏移量超出范围并且无法复制
- 提升范围for_each、绑定、复制和back_inserter的组合失败
- 在范围内存在不可复制的局部变量时按值捕获
- 在可能重叠的范围之间复制类
- 正在从方法范围复制char*
- 如何用范围内的随机值填充数组?(可以复制.)
- 为什么boost::equals要求范围是可复制的?
- 如何在不复制的情况下从n维容器中获得可迭代范围