我在理解如何实现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*
值,该值指向数组中存储的对象。这可以吗?
答案 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标题肯定难以解析,但是如果你在内存方面考虑它会有意义:
如果有人知道血腥,我会很感激。但是,如果有人知道血腥的话,我会很感激。