如何根据多个参数查找容器中的对象范围
How to find a range of objects in containers based on more than one parameter
我正在寻找根据两个排序参数的位置从大型集合中提取对象的最佳方法。
的例子:
struct Object{
Time start;
Time end;
//... data
};
现在,对于任何时间t
,我想快速找到在此时间内"存在"的所有对象,即t
位于对象的start
和end
值之间。
我想到的方法是:
std::multimap<Time, object*> objectsOrderedByStart;
std::multimap<Time, object*> objectsOrderedByEnd;
(multimap
,因为可能有许多对象具有相同的Time
值,这些值是排序的键)
每次创建Object
时,我都会将其添加到每个multimap
中,这会自动将对象放置在start
和end
的排序列表中。
然后我通过查找objectsOrderedByStart
中包含t>Time
的所有对象和objectsOrderedByEnd
中包含t<End
的对象来"查询"时间t
的有效对象,然后只取两个结果集中的对象。但这似乎效率很低,我能想到的唯一找到并集的方法就是逐个遍历一个结果集,看看这个对象是否在另一个结果集中。
然而,我怀疑这不是最有效的方法。我可以在迭代每个multimap
时跳过元素进行迭代,而不是逐个迭代,然后如果我走得太远,从最后一个跳过点开始逐个迭代。或者,我可以只保留一个multimap
,然后查看每个object
的end
时间。
但我怀疑是否有更好的方法来组织这些数据并找到我感兴趣的范围?
您可以使用两个手动排序的数组而不是两个multimaps,然后使用std::lower_bound
和std::upper_bound
,或手动编码的二进制搜索,在其中进行搜索。
我认为你应该看看Boost。ICL
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 如何访问超出其块范围的对象?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 对象超出范围/转让所有权
- 从函数返回范围视图时,带有std::span:中间对象所有权的C++Ranges-v3
- 读取互斥对象范围之外的volatile变量,而不是std::atomic
- 是否可以在C++ (C) 中使用全局范围对象(结构)?
- 基于范围的 for 循环将对象移动到另一个容器中?
- 对象超出范围后,引用成员设置为 0
- 哪个函数负责C++全局范围内的类对象初始化?
- 非常量对象的向量似乎在基于范围的 for 循环中被视为常量
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 什么是OOP中的对象范围
- 在C++中,指向对象的指针将指向对象范围之外的内容
- 抛出的对象范围
- C++:在对象范围外调用析构函数
- 如何根据多个参数查找容器中的对象范围
- 将对象范围扩展到if语句之外