C++ boost::多索引组合键效率

C++ boost::多索引组合键效率,c++,boost,composite-key,processing-efficiency,multi-index,C++,Boost,Composite Key,Processing Efficiency,Multi Index,长期读者第一次海报!我在玩Booost::多索引容器容器,并且有一个相当深入的问题,希望一个提升或C++容器专家可能知道我在C++容器中的知识是非常基本的。有关复合键的boost文档可在以下位置找到以供参考: 当使用复合键时,文档说明复合键按字典顺序排序,即排序由第一个键执行,如果第一个键相等,则由第二个键执行,等等。这是否意味着存储结构,以便对特定的由两部分组成的复合键进行查找将花费=1次,也就是说,容器的排序是否使得有一个指针直接指向每个项,或者boost容器是否检索到与组合键的第一部分匹配

长期读者第一次海报!我在玩Booost::多索引容器容器,并且有一个相当深入的问题,希望一个提升或C++容器专家可能知道我在C++容器中的知识是非常基本的。有关复合键的boost文档可在以下位置找到以供参考:

当使用复合键时,文档说明复合键按字典顺序排序,即排序由第一个键执行,如果第一个键相等,则由第二个键执行,等等。这是否意味着存储结构,以便对特定的由两部分组成的复合键进行查找将花费=1次,也就是说,容器的排序是否使得有一个指针直接指向每个项,或者boost容器是否检索到与组合键的第一部分匹配的列表,然后需要搜索与键的第二部分匹配的项,因此速度较慢

例如,如果我要使用两个不同的索引手动维护两个容器,并希望查找与特定两部分查询匹配的项,我可能会筛选第一个容器中与查询第一部分匹配的所有项,然后筛选结果中与查询第二部分匹配的项。因此,这种手动方法实际上需要两次搜索。boost是有效地做到了这一点,还是通过使用组合键以某种方式提高了效率


希望我已经在这里解释了我自己,但请提问,我会尽我最大的努力澄清我的意思

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

也许举个例子可以说明问题。考虑使用CypItEyKEY:

生成的容器在某种意义上等同于:

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;

复合_键自动生成与元素_cmp::operator中的代码等效的代码,另外还允许仅查找前n个键,但基础数据结构不会因使用std::set的情况而改变。

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

也许举个例子可以说明问题。考虑使用CypItEyKEY:

生成的容器在某种意义上等同于:

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;

复合_键会自动生成与元素_cmp::operator中的代码等效的代码,另外还允许仅查找前n个键,但底层数据结构不会因使用std::set而改变。

一个示例显示1000个单词。它还为我们提供了一个快速的机会来进行一些测量和深入研究库的实现。我认为,由于boost::multi_索引文档中有一个例子,通过我放入的超链接,所以不值得在这里重复它?一个例子说1000字。它还为我们提供了一个快速的机会来进行一些测量并深入研究库的实现。我认为,由于boost::multi_索引文档中有一个通过我放入的超链接进行的示例,因此不值得在这里重复它。因此,就查找时间而言,三个索引中的每一个的查找比较如何?i、 e.你能比x=1,y=2,z=3的所有键更快地检索到x=1的所有键吗?如果只对z=3执行查找,会怎么样?谢谢你到目前为止的回复,顺便说一句,我想我们正在仔细研究我的答案:!提供的示例没有三个索引,只有一个索引,通过复合键,它允许查找x、x、y和x、y、z,所有这些索引的性能大致相同。为了有效地查找z值,你需要一个额外的索引。啊,好吧,那么如果我有三个单独的索引,并且组合中包含所有三个索引,那么使用组合比只使用z索引要慢?这就是我的问题所在,boost复合键搜索的效率有多高,它实际上比为一个单独的索引获取一个迭代器,然后使用您检索到的迭代器在multi_索引容器外获取另一个过滤器快吗。或者,它是否有效地为你做了所有这些,因此只是一种更好、更干净的方式?抱歉,我知道我在问一个奇怪的问题。如果你想查找x=1,y=2,z=3,使用复合_键比查找x=1并通过线性扫描对结果进行后过滤要快得多。此外,无法分别在x、y和z上使用三个不同的索引来更有效地执行x=1、y=2、z=3查找。我认为你混淆了术语:在x,y,z上有一个复合键的索引与在x,y和z上的三个单独索引不同。好的,谢谢,这正是我想知道的:!所以它确实创建了som
一种指针结构,意味着在三个单独的索引上有很好的加速。非常感谢。那么,就查找时间而言,三个索引中的每一个的查找比较结果如何?i、 e.你能比x=1,y=2,z=3的所有键更快地检索到x=1的所有键吗?如果只对z=3执行查找,会怎么样?谢谢你到目前为止的回复,顺便说一句,我想我们正在仔细研究我的答案:!提供的示例没有三个索引,只有一个索引,通过复合键,它允许查找x、x、y和x、y、z,所有这些索引的性能大致相同。为了有效地查找z值,你需要一个额外的索引。啊,好吧,那么如果我有三个单独的索引,并且组合中包含所有三个索引,那么使用组合比只使用z索引要慢?这就是我的问题所在,boost复合键搜索的效率有多高,它实际上比为一个单独的索引获取一个迭代器,然后使用您检索到的迭代器在multi_索引容器外获取另一个过滤器快吗。或者,它是否有效地为你做了所有这些,因此只是一种更好、更干净的方式?抱歉,我知道我在问一个奇怪的问题。如果你想查找x=1,y=2,z=3,使用复合_键比查找x=1并通过线性扫描对结果进行后过滤要快得多。此外,无法分别在x、y和z上使用三个不同的索引来更有效地执行x=1、y=2、z=3查找。我认为你混淆了术语:在x,y,z上有一个复合键的索引与在x,y和z上的三个单独索引不同。好的,谢谢,这正是我想知道的:!因此,它确实创建了某种指针结构,这意味着在三个单独的索引上有很好的加速。非常感谢。