Essential c++ 第三章代碼(有疑問)

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <list>

using namespace std;

template <typename InputIterator, typename OutputIterator, typename ElemType, typename Comp>
OutputIterator filter( InputIterator first, InputIterator last, OutputIterator at, const ElemType &val, Comp pred)
{
    while (( first = find_if( first, last, bind2nd( pred, val ))) != last)
    {
        cout << "found value: " << *first << endl;
        *at++ = *first++;
    }
    return at;
}

//要求將sub_vec改寫爲一個template function
//vector<int> sub_vec( const vector<int> &vec, int val)
//{
//    vector<int> local_vec( vec );
//    sort( local_vec.begin(), local_vec.end() );
//
//    vector<int>::iterator iter = find_if( local_vec.begin(), local_vec.end(), bind2nd( greater<int>(), val));
//
//    local_vec.erase( iter, local_vec.end() );
//    return local_vec;
//}


template <typename InputIterator, typename OutputIterator, typename ElemType, typename Comp>
void sub_vec( InputIterator first, InputIterator last, OutputIterator at, const ElemType &val, Comp pred)
{
    vector<ElemType> local_vec(first, last);




    sort( local_vec.begin(), local_vec.end(), not2( pred ) );

    cout << "after sort: ";
    for( int ix = 0; (unsigned)ix < local_vec.size(); ix++)
        cout << local_vec[ix] << ' ';
    cout << endl;

    // vector<ElemType>::iterator it; 不合法,爲什麼?!
    // find_if( local_vec.begin(), local_vec.end(), bind2nd( pred, val))是什麼類型的?
    copy( local_vec.begin(), find_if( local_vec.begin(), local_vec.end(), bind2nd( pred, val)), at);
    cout << "found value: " << *find_if( local_vec.begin(), local_vec.end(), bind2nd( pred, val)) <<endl;

}


int main()
{
    const int elem_size = 8;

    int ia[elem_size] = {12,10,43,0,6,21,3,7};
    vector<int> ivec( ia, ia+elem_size);


    int ia2[elem_size];
    vector<int> ivec2(elem_size);

    int ia3[elem_size] = {0,0,0,0,0,0,0,0};
    vector<int> ivec3(elem_size);

    cout << "filtering integer array for values less than 8\n";
    filter( ia, ia+elem_size, ia2, elem_size, less<int>() );
    cout << endl;

    cout << "filtering integer vector for values greater than 8\n";
    filter( ivec.begin(), ivec.end(), ivec2.begin(), elem_size, greater<int>());
    cout << endl;

    cout << "filtering integer array for values less than or equal to 10\n";
    sub_vec( ia, ia+elem_size, ia3, 10, greater<int>() );
    for (int ix = 0; ix < 8; ix++)
        cout << ia3[ix] << ' ';
    cout << endl;

    cout << "filtering integer vector for values less than or equal to 10\n";
    sub_vec( ivec.begin(), ivec.end(), ivec3.begin(), 10, greater<int>() );
    for (int ix = 0; ix < 8; ix++)
        cout << ivec3[ix] << ' ';
    cout << endl;

    list<int> ilist(ia, ia+8);
    list<int> ilist1(8);
    cout << "filtering integer list for values greater than or equal to 12\n";
    sub_vec (ilist.begin(), ilist.end(), ilist1.begin(), 12, less<int>() );
    for( list<int>::iterator iter = ilist1.begin(); iter != ilist1.end(); iter++)
        cout << *iter << ' ';

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章