设为首页 加入收藏

TOP

用BOOST BIND库提高C++性能(四)
2014-04-06 17:35:17 来源: 作者: 【 】 浏览:335
Tags:BOOST  BIND 提高 性能

 

  public:

  Status(const std::string &name) : name_(name), ok_(true){}

  void BreakIt()

  {

  ok_ = false;

  }

  bool IsBroken() const

  {

  return ok_;

  }

  void Report() const

  {

  std::cout 《 name_ 《  is  《 (ok_ ok : broken) 《 std::endl;

  }

  private:

  std::string name_;

  bool ok_;

  };

  int main()

  {

  std::vector<STATUS> v_status;

  v_status.push_back(Status(status 1));

  v_status.push_back(Status(status 2));

  v_status.push_back(Status(status 3));

  v_status.push_back(Status(status 4));

  v_status .BreakIt();

  v_status .BreakIt();

  std::cout 《 use or: 《 std::endl;

  for (std::vector<STATUS>::iterator it = v_status.begin(); it < v_status.end(); it++)

  {

  it->Report();

  }

  std::cout 《

  use or_each, mem_fun_ref: 《 std::endl;

  std::for_each(v_status.begin(), v_status.end(), std::mem_fun_ref(&Status::Report));

  std::cout 《

  use or_each, bind: 《 std::endl;

  //std::for_each(v_status.begin(), v_status.end(), boost::bind(&Status::Report));    //error

  std::for_each(v_status.begin(), v_status.end(), boost::bind(&Status::Report, _1));

  }</STATUS></STATUS></BOOST></ALGORITHM></VECTOR></STRING></IOSTREAM>

  总结:

  bind成员函数最大的不同是,必须指明调用该函数的实例对象,代码中用"_1"表示。

  翻译:调用成员函数(2)

  下面,我们稍微改造一下vector容器,让它装入指针而不是值:

  std::vector<STATUS*> p_statuses;

  p_statuses.push_back(new status(status 1));

  p_statuses.push_back(new status(status 2));

  p_statuses.push_back(new status(status 3));

  p_statuses.push_back(new status(status 4));

  p_statuses ->break_it();

  p_statuses ->break_it();</STATUS*>

  我们仍然可以用两种标准库,但是我们不能用mem_fun_ref,而是用mem_fun适配器,虽然它的名字听起来有点儿混淆,完成操作还是没问题的。

  std::for_each(

  p_statuses.begin(),

  p_statuses.end(),

  std::mem_fun(&status::report));

  注意到,这段代码的语法已经有所改变,尽管我们要做的工作几乎相同。当然,如果代码的语法和上面的例子一样就最好了,这样我们就可以更多地关注代码到底做了些什么而不是它怎么做的。使用Bind,我们不需要显式指明要处理的元素是指针(这在容器类型中已经说明了,重复的信息在现代的库里面显然是不必要的)

  std::for_each(

  p_statuses.begin(),

  p_statuses.end(),

  boost::bind(&status::report,_1));

  如你所见,这与之前非指针元素的代码没有任何区别。也就是说如果你理解了刚才的bind,那么这个也能理解。

  #include <IOSTREAM>

  #include <STRING>

  #include <VECTOR>

  #include

  #include <BOOST bind.hpp="">

  class Status

  {

  public:

  Status(const std::string &name) : name_(name), ok_(true){}

  void BreakIt()

  {

  ok_ = false;

  }

  bool IsBroken() const

  {

  return ok_;

  }

  void Report() const

  {

  std::cout 《 name_ 《  is  《 (ok_ ok : broken) 《 std::endl;

  }

  private:

  std::string name_;

  bool ok_;

  };

  int main()

  {

  std::vector<STATUS*> v_pstatus;

  v_pstatus.push_back(new Status(status 1));

  v_pstatus.push_back(new Status(status 2));

  v_pstatus.push_back(new Status(status 3));

  v_pstatus.push_back(new Status(status 4));

  v_pstatus ->BreakIt();

  v_pstatus ->BreakIt();

  std::cout 《 use or: 《 std::endl;

  for (std::vector<STATUS*>::iterator it = v_pstatus.begin(); it < v_pstatus.end(); it++)

  {

  (*it)->Report();

  }

  std::cout 《

  use or_each, mem_fun_ref: 《 std::endl;

  std::for_each(v_pstatus.begin(), v_pstatus.end(), std::mem_fun(&Status::Report));

  std::cout 《

  use or_each, bind: 《 std::endl;

  std::for_each(v_pstatus.begin(), v_pstatus.end(), boost::bind(&Status::Report, _1));

  }</STATUS*></STATUS*></BOOST></ALGORITHM></VECTOR></STRING></IOSTREAM>

        

首页 上一页 1 2 3 4 5 下一页 尾页 4/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ 指针的偏移 下一篇数据结构内存管理c++实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)