0

remove_copy_ifを使用して、 ostream_iteratorを介してiterable直接コピーしようとしています。が出力範囲の終わりまでであることを保証します。この戻り値は、出力イテレーターの開始と戻りイテレーターの間の距離を調べることにより、宛先にコピーされた要素の数を判別する方法で役立ちます。これは、コンテナを使用する場合には意味がありますが、同じ機能を使用して、宛先にコピーされる要素の数を決定する方法です。stdoutremove_copy_ifreturn valueiteratorostream_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;
    } 
4

1 に答える 1

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;
    } 
于 2012-10-02T09:26:21.043 に答える