如何实现boost multi_index

时间:2010-11-17 16:00:23

标签: c++ boost multi-index boost-multi-index

我在理解如何实现Boost.MultiIndex方面遇到了一些困难。可以说我有以下内容:

typedef multi_index_container<
    employee,
    indexed_by<    
        ordered_unique<member<employee, std::string, &employee::name> >,
        ordered_unique<member<employee, int, &employee::age> >
    > 
> employee_set;

我想我有一个数组Employee[],它实际上存储了employee个对象,还有两个地图

map<std::string, employee*>
map<int, employee*>

以姓名和年龄为关键字。每个映射都有employee*值,该值指向数组中存储的对象。这可以吗?

3 个答案:

答案 0 :(得分:30)

对基础结构的简短解释给出here,引用如下:

实现基于与指针相互链接的节点,就像您最喜欢的std::set实现一样。我将详细说明:std::set通常实现为rb-tree,其中节点看起来像

struct node
{
  // header
  color      c;
  pointer    parent,left,right;
  // payload
  value_type value;
};

嗯,A multi_index_container的节点基本上是一个“多节点”,其头部和索引以及有效负载一样多。例如,具有两个所谓的有序索引的multi_index_container使用看起来像

的内部节点
struct node
{
  // header index #0
  color      c0;
  pointer    parent0,left0,right0;
  // header index #1
  color      c1;
  pointer    parent1,left1,right2;
  // payload
  value_type value;
};

(现实更复杂,这些节点是通过某些元编程等生成的,但你明白了这一点)[...]

答案 1 :(得分:4)

从概念上讲,是的。

根据我对Boost.MultiIndex的理解(我已经使用过它,但没有看到实现),带有两个ordered_unique索引的示例确实会创建两个已排序的关联容器(如std::map)它将指针/引用/索引存储到一组公共employee s。

在任何情况下,每个employee仅在多索引容器中存储一次,而map<string,employee>map<int,employee>的组合将每个员工存储两次。

很可能在一些多索引容器中确实有一个(动态)数组,但是no guarantee这是真的:

  

[随机访问索引]不提供内存连续性,   std::vector s的属性   元素与一个元素相邻存储   另一个在一块记忆中。

此外,Boost.Bimap is based on Boost.MultiIndex和前者允许对其“骨干”结构进行不同的表示。

答案 2 :(得分:2)

实际上我认为不是。

根据detail/node_type.hpp中的内容。在我看来,像std::map节点将包含值和索引。除了在这种情况下,各种索引彼此不同,因此节点交错实际上会根据您所遵循的索引而有所不同。

我不确定这一点,Boost标题肯定难以解析,但是如果你在内存方面考虑它会有意义:

  • 减少分配:更快的分配/解除分配
  • 更好的缓存位置

如果有人知道血腥,我会很感激。但是,如果有人知道血腥的话,我会很感激。