boost :: multi_index复合键效率

时间:2013-12-01 14:18:03

标签: c++ boost composite-key processing-efficiency multi-index

长时间读者第一次海报!我正在使用boost :: multi_index容器,并且有一个相当深入的问题,希望推文或C ++容器专家可能知道(我在C ++容器中的知识非常基本)。有关复合键的增强文档,请参阅此处:boost::multi_index composite keys.

当使用复合键时,文档说明"复合键按字典顺序排序,即排序由第一个键执行,然后第二个键如果第一个键相等,等等#34;。这是否意味着存储结构使得对特定的2部分复合键的查找将花费O(n = 1)时间,即,容器被排序为使得指针直接指向每个项目,或者是否提升容器检索与复合键的第一部分匹配的列表,然后需要搜索与键的第二部分匹配的项目,因此速度较慢?

例如,如果我要使用两个不同的索引手动维护两个容器,并且想要查找与特定的两部分查询匹配的项目,我可能会筛选与查询的第一部分匹配的所有项目的第一个容器,并且然后筛选与查询的第二部分匹配的项目的结果。因此,这种手动方法实际上涉及两次搜索。是否有效地通过使用复合键来有效地实现这一点,还是通过使用复合键来提高效率?

希望我在这里解释自己,但请提出问题,我会尽力澄清我的意思!

1 个答案:

答案 0 :(得分:4)

涉及复合键的查找不会像您描述的那样经历任何两阶段过程。 composite_key - 诱导排序是正常的排序,唯一的特殊之处在于它依赖于两个或多个元素键而不是一个。

也许一个例子会澄清。考虑使用composite_key

struct element
{
  int x,y,z;
};

typedef multi_index_container<
  element,
  indexed_by<
    ordered_unique<
      composite_key<
        element,
        member<element,int,&element::x>,
        member<element,int,&element::y>,
        member<element,int,&element::z>
      >
    >
  >
> multi_t;

生成的容器在某种意义上与此相当:

struct element_cmp
{
  bool operator()(const element& v1, const element& v2)const
  {
    if(v1.x<v2.x)return true;
    if(v2.x<v1.x)return false;
    if(v1.y<v2.y)return true;
    if(v2.y<v1.y)return false;
    return v1.z<v2.z;
  }
};

typedef std::set<element,element_cmp> set_t;

composite_key自动生成与element_cmp::operator()中的代码相同的代码,并且还允许仅查找前n个键,但基础数据结构不会因使用{{1 }}