Определите конец скопированного диапазона при использовании remove_copy_if с 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;
}

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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]