长时间读者第一次海报!我正在使用boost :: multi_index容器,并且有一个相当深入的问题,希望推文或C ++容器专家可能知道(我在C ++容器中的知识非常基本)。有关复合键的增强文档,请参阅此处:boost::multi_index composite keys.
当使用复合键时,文档说明"复合键按字典顺序排序,即排序由第一个键执行,然后第二个键如果第一个键相等,等等#34;。这是否意味着存储结构使得对特定的2部分复合键的查找将花费O(n = 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 }}