【boost】boost侵入式容器

ASCII表

每个要插入到侵入式容器中的类都需要包含一个 hook,该 hook 将提供可插入容器中的必要数据和资源(比如前后指针),Boost.Intrusive 提供了三种 hook:

  • base hooks
  • member hooks
  • function hooks

base hooks

所谓 bask hooks,就是一个含有必要数据和资源的基类,原始对象通过继承该基类从而获得这些数据与资源:

#include <boost/intrusive/list.hpp>

struct Record : public boost::intrusive::list_base_hook<> {
public:
  explicit Record(std::string name) : name(std::move(name)) {}
  std::string name;
};

Record cr1("tom");
Record cr2("jerry");
Record cr3("spike");

boost::intrusive::list<Record> rlst;
rlst.push_back(cr1);
rlst.push_front(cr2);
rlst.push_back(cr3);
std::cout << "size: " << rlst.size() << std::endl;

有时候继承并不是一个最好的选择,因为类层级的增加势必会带来一定的消耗,而且可能会影响原有的类层级设计;因此Boost.Intrusive 还提供了 member hook 的方式来将容器所需要的数据插入到对象当中,简而言之就是显式地在对象类中插入一个 list_member_hook 作为公共数据成员,这种做法会更贴近传统 C 侵入式容器的做法。

struct Record {
public:
  explicit Record(std::string name) : name(std::move(name)) {}
  
  std::string name;
  boost::intrusive::list_member_hook<> hook;
};

正如为使用 list_base_hook 的对象创建侵入式链表时需要使用 base_hook 作为 boost::intrusive::list 的第二个模板参数一样,为使用 list_member_hook 的对象创建侵入式链表时则需要使用 member_hook 作为链表的第二个模板参数:

using namespace boost::intrusive;
list<Record, member_hook<Record, list_member_hook<>, &Record::hook>> rlst;

member_hook 的类型定义如下:

template<typename Parent, typename MemberHook, MemberHook Parent::* PtrToMember>
struct member_hook;

参考资料

1. Boost: 侵入式容器

2. intrusive list介绍

posted @ 2018-09-26 15:59  苏格拉底的落泪  阅读(243)  评论(0)    收藏  举报