Chinaunix首页 | 论坛 | 博客
  • 博客访问: 885199
  • 博文数量: 254
  • 博客积分: 5350
  • 博客等级: 大校
  • 技术积分: 2045
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 13:27
文章分类

全部博文(254)

文章存档

2015年(1)

2014年(9)

2013年(17)

2012年(30)

2011年(150)

2010年(17)

2009年(28)

2008年(2)

分类: LINUX

2013-07-24 11:40:48


点击(此处)折叠或打开

  1. /*
  2.  * bind.cpp
  3.  *
  4.  * Created on: 2013-7-16
  5.  * Author: root
  6.  */
  7. #include <vector>
  8. #include <string>
  9. #include <iostream>
  10. #include <map>

  11. #include <boost/bind.hpp>

  12. using namespace std;

  13. class personal_info
  14. {
  15. public:
  16.     std::string name_;
  17.     std::string surname_;
  18.     unsigned int age_;

  19. public:
  20.     personal_info(const string& n,const string& s, unsigned int age):
  21.         name_(n),surname_(s),age_(age) { }

  22.     string name()const { return name_; }

  23.     string surname()const { return surname_; }

  24.     unsigned int age()const { return age_; }
  25. };
  26. //构造输出流
  27. std::ostream& operator<<(std::ostream& os, const personal_info& pi)
  28. {
  29.     os << pi.name_ << ' ' << pi.surname_ << ' ' << pi.age_ << '\n';
  30.     return os;
  31. }

  32. void print_string(const string& s)
  33. {
  34.     cout << s << '\n';
  35. }

  36. //绑定的复制问题
  37. class tracer
  38. {
  39. public:
  40.     tracer(){ cout << "tracer()\n"; }
  41.     tracer(const tracer& other) { cout << "tracer(const tracer& other)\n"; }
  42.     tracer& operator=(const tracer& other) { cout << "tracer& operator=(const tracer& other)\n"; return *this;}
  43.     ~tracer(){ cout << "~tracer()\n"; }

  44.     void print(const string& s)
  45.     {
  46.         cout << s << '\n';
  47.     }
  48. };

  49. /*
  50. int main()
  51. {
  52. //灵活对类结构体根据不成成员排序
  53.     std::vector<personal_info> vec;

  54.     vec.push_back(personal_info("Little","John",30));
  55.     vec.push_back(personal_info("Friar","Tuck",50));
  56.     vec.push_back(personal_info("Robben","Hord",40));
  57.     vec.push_back(personal_info("Jerry","Park",36));
  58.     vec.push_back(personal_info("Smith","Jim",33));

  59.     //按年龄排序
  60.     std::sort(vec.begin(),vec.end(),
  61.             boost::bind(
  62.                     std::less<unsigned int>(),//第一个绑定函数,函数有括号,sort调用的less函数需要返回bool的值类型,但标准库函数都包含
  63. //                    typedef result_type,就不需要显示给出值类型.完整为 boost::bind<bool>(std::less<unsigned int>(),_1,_2)
  64.                     boost::bind(&personal_info::age,_1), //第二个为绑定器,函数无括号,_1为less的参数
  65.                     boost::bind(&personal_info::age,_2)) );//第三个为绑定器,函数无括号,_2为less的参数

  66.     std::cout << vec[0] << '\n' <<
  67.             vec[1] << '\n' <<
  68.             vec[2] << '\n' <<
  69.             vec[3] << '\n' <<
  70.             vec[4] << '\n';

  71.     //按后缀名排序
  72.     std::sort(vec.begin(),vec.end(),
  73.             boost::bind(
  74.                     std::less<std::string>(),//第一个绑定函数,函数有括号
  75.                     boost::bind(&personal_info::surname,_1), //第二个为绑定器,函数无括号,_1为less的参数
  76.                     boost::bind(&personal_info::surname,_2)) );//第三个为绑定器,函数无括号,_2为less的参数

  77.     std::cout << vec[0] << '\n' <<
  78.             vec[1] << '\n' <<
  79.             vec[2] << '\n' <<
  80.             vec[3] << '\n' <<
  81.             vec[4] << '\n';
  82. //================================================
  83. //    复制问题
  84.     tracer t;
  85.     boost::bind(&tracer::print,t,_1)(std::string("I'm call on a copy of it\n"));
  86. //绑定时使用拷贝对象可以不依赖原对象的生命期,但会影响效率,可以使用使用boost::ref(t),
  87.     boost::bind(&tracer::print,&t,_1)(std::string("I'm call on direct\n")); //此时bind依赖原对象的生命期

  88. //================================================
  89.     //绑定到成员变量 直接获取得到data而不是key
  90.     std::map<int ,std::string> my_map;
  91.     my_map[0] = "smithy";
  92.     my_map[1] = "jerry";

  93. //    std::for_each(my_map.begin(),my_map.end(),
  94. //            boost::bind(&print_string,boost::bind(&std::map<int ,std::string>::value_type::second,_1)));

  95.     typedef std::map<int ,std::string> map_type;
  96.         std::for_each(my_map.begin(),my_map.end(),
  97.                 boost::bind(&print_string,boost::bind(&map_type::value_type::second,_1)));
  98. }
  99. */

阅读(1456) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~