2012-10-01 3 views
0

을 사용하여 iterablestdout에서 ostream_iterator으로 직접 복사하려고합니다. remove_copy_ifreturn value이 출력 범위의 끝까지 iterator임을 보장합니다. 이 리턴 값은 출력 반복자의 시작과 리턴 반복자 사이의 거리를 알아 냄으로써 대상에 복사 된 요소의 수를 판별하는 데 유용합니다. 컨테이너를 사용할 때 이것은 의미가 있지만 같은 기능을 사용하여 대상에 복사되는 요소의 수를 결정하는 방법은 ostream_iterator입니다.ostream_iterator를 사용하여 remove_copy_if를 사용할 때 복사 된 끝의 끝을 확인하십시오.

하면 내가

#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

나는 그렇게 생각하지 않습니다. 'ostream_iterator'는 OutputIterator 일뿐입니다. 단일 패스이기 때문에 거리에 대한 유용한 개념을 가지고 있지 않습니다. end iterator는 시작 반복자에서 얼마나 멀리 떨어져 있는지 기억하지 못합니다. 이 사이트에서는 출력용 BidirectionalIterator 또는 특히 RandomAccessIterator를 전달한 경우 반환 값이 유용 할 것이라고 말합니다. 'ostream_iterator'도 아니다. –

+0

@SteveJessop : 동의합니다. 다른 가능한 방법이 있는지 확인하려고했습니다. 내가 생각할 수없는 것. – Abhijit

+0

나는 명백한 (하지만 귀찮은) -'ostream_iterator'를 래핑하고 카운트를 유지하는 출력 반복자를 작성한다고 생각합니다. –

답변

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