C++ 如何实现boost多_索引

C++ 如何实现boost多_索引,c++,boost,multi-index,boost-multi-index,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, in

我在理解如何实现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*
值,该值指向数组中存储的对象。这样可以吗?

从概念上讲,可以

根据我对Boost.MultiIndex的理解(我使用过它,但没有看到它的实现),您的示例中有两个
ordered\u unique
索引,实际上将创建两个排序关联容器(如
std::map
),它们将指针/引用/索引存储到一组公共的
employee

在任何情况下,每个
employee
在多索引容器中只存储一次,而
map
map
的组合将存储每个employee两次

很可能在一些多索引容器中确实存在(动态)数组,但有一点是正确的:

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


而且,前者允许对其“主干”结构进行不同的表示。

事实上,我认为它不是

基于
详细信息/node\u type.hpp
中的内容。在我看来,就像std::map一样,节点将同时包含值和索引。除了在这种情况下,不同的索引彼此不同,因此节点交错实际上会根据您所遵循的索引而不同

不过,我不确定这一点,Boost头肯定很难解析,但是如果您从内存的角度考虑,这是有意义的:

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

不过,如果有人知道戈尔的情况,我希望能给出一个明确的答案。

下面引用了对基本结构的简短解释:

该实现基于与指针链接的节点,就像您最喜欢的
std::set
实现一样。我将对此进行详细说明:
std::set
通常被实现为一个rb树,其中节点看起来像

struct node
{
  // header
  color      c;
  pointer    parent,left,right;
  // payload
  value_type value;
};
好的,
多索引容器的节点基本上是一个“多节点”,具有与索引和负载一样多的标题。例如,具有两个所谓的有序索引的
多索引容器
使用的内部节点如下所示

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

(实际情况更为复杂,这些节点是通过一些元编程等方式生成的,但你知道了)[…]

int
是一种基本类型。它不在
std::
名称空间中。根据位于的图片,它的实现正是您想象的。+1准确地解释了OP的用例。我想知道Boost.MultiIndex是否在内部使用Boost.Intrusive?不,Boost.MultiIndex不使用Boost.Intrusive,主要是因为前一个库比后一个库旧。根据Boost进行重写。尽管侵入性原则上是可行的。@JoaqínMLópezMuñoz:我知道这是一个古老的答案,但是如果你能在这里发布你的电子邮件摘录,那就太好了。SO问答的指导原则是直接提供细节,这样链接腐烂或离线查看不会显著降低它们的价值。@JoaqínMLópezMuñoz:谢谢!!
struct node
{
  // header index #0
  color      c0;
  pointer    parent0,left0,right0;
  // header index #1
  color      c1;
  pointer    parent1,left1,right2;
  // payload
  value_type value;
};