使用boost lambda 实现排序实现函数,省去写仿函数

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
void test1()
{
    std::vector<int> vec(3);
    vec[0] = 12;
    vec[1] = 5;
    vec[2] = 7;
    using namespace boost::lambda;
    std::sort(vec.begin(),vec.end(),_1 < _2);            //排序
    std::for_each(vec.begin(), vec.end(), std::cout<<_1<<' ');
    std::cout<<std::endl;
    std::sort(vec.begin(),vec.end(),_1 > _2);            //排序
    std::for_each(vec.begin(), vec.end(), std::cout<<_1<<' ');
    std::cout<<std::endl;
}
struct t
{
    t(){}
    t(int _i,int _j):i(_i),j(_j){}
    int i,j;
    int val()    const {    return i;    }
};
void test2()
{
    std::vector<t> vec(3);
    vec[0] = t(12,28);
    vec[1] = t(17,23);
    vec[2] = t(14,21);
    using namespace boost::lambda;
    //使用boost lambda 
    std::sort(vec.begin(),vec.end(),(_1>_2)(bind(&t::val,_1),bind(&t::val,_2)));
    std::for_each(vec.begin(), vec.end(), 
            std::cout<<'('<<bind(&t::i,_1)<<','<<bind(&t::j,_1)<<") ");
    std::cout<<std::endl;
    //输出为 (17,23) 14,21) 12,28),后面两项没有前括号
    std::sort(vec.begin(),vec.end(),bind(&t::val,_1) < bind(&t::val,_2));
    std::for_each(vec.begin(), vec.end(), 
            std::cout<<constant('(')<<bind(&t::i,_1)<<','<<bind(&t::j,_1)<<") ");
    std::cout<<std::endl;
    //输出为 (12,28) (14,21) (17,23),使用了constant函数,后面两项有前括号
            
//    std::sort(vec.begin(),vec.end(),(_1<_2)(bind(&t::i,_1),bind(&t::i,_2)));
    //编译错误
    std::sort(vec.begin(),vec.end(),(&_1)->* &t::j < (&_2)->* &t::j);
    std::for_each(vec.begin(), vec.end(), 
            std::cout<<constant('(')<<bind(&t::i,_1)<<','<<bind(&t::j,_1)<<") ");
    //输出为(14,21) (17,23) (12,28)
}
int main(int argc, char* argv[])
{   
    test1();
    test2();
    return 0;
}
posted @ 2011-03-22 16:19  海畅  阅读(957)  评论(0)    收藏  举报