如何根据多个参数查找容器中的对象范围

How to find a range of objects in containers based on more than one parameter

本文关键字:对象 范围 查找 何根 参数      更新时间:2023-10-16

我正在寻找根据两个排序参数的位置从大型集合中提取对象的最佳方法。

的例子:

struct Object{
    Time start;
    Time end;
    //... data
};

现在,对于任何时间t,我想快速找到在此时间内"存在"的所有对象,即t位于对象的startend值之间。

我想到的方法是:

std::multimap<Time, object*> objectsOrderedByStart;
std::multimap<Time, object*> objectsOrderedByEnd;

(multimap,因为可能有许多对象具有相同的Time值,这些值是排序的键)

每次创建Object时,我都会将其添加到每个multimap中,这会自动将对象放置在startend的排序列表中。

然后我通过查找objectsOrderedByStart中包含t>Time的所有对象和objectsOrderedByEnd中包含t<End的对象来"查询"时间t的有效对象,然后只取两个结果集中的对象。但这似乎效率很低,我能想到的唯一找到并集的方法就是逐个遍历一个结果集,看看这个对象是否在另一个结果集中。

然而,我怀疑这不是最有效的方法。我可以在迭代每个multimap时跳过元素进行迭代,而不是逐个迭代,然后如果我走得太远,从最后一个跳过点开始逐个迭代。或者,我可以只保留一个multimap,然后查看每个objectend时间。

但我怀疑是否有更好的方法来组织这些数据并找到我感兴趣的范围?

您可以使用两个手动排序的数组而不是两个multimaps,然后使用std::lower_boundstd::upper_bound,或手动编码的二进制搜索,在其中进行搜索。

我认为你应该看看Boost。ICL