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