2012-10-01 75 views
0

我試圖使用remove_copy_ifiterable直接複製到stdoutostream_iteratorremove_copy_if保證return valueiterator到輸出範圍的末尾。通過找出輸出迭代器的開始與返回迭代器之間的距離,此返回值有助於確定複製到目標的元素的數量。這在使用容器時很有意義,但如何使用相同的功能來確定複製到目標的元素的數目(如果其爲ostream_iterator)。確定在使用remove_copy_if和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

我不認爲你可以。 'ostream_iterator'只是一個OutputIterator,它沒有這樣一個有用的距離概念,因爲它是單遍的。結束迭代器當然不記得它離開始迭代器有多遠。該網站表示,如果您爲輸出傳遞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; 
    } 
相關問題