我有类:
class A{
//fields, methods
;
我需要一个有效的数据结构,允许你从各种指向a类最小值和最大值对象的指针中进行选择(它应该在线工作,也就是说,问题的选择将与添加新指针的请求交替进行)。这可以通过使用两个优先级队列来实现:
priority_queue<A*, vector<A*>, ComparatorForFindingLightestObjects>* qL;
priority_queue<A*, vector<A*>, ComparatorForFindingHardestObjects>* qH;
问题是,如果对象指针是从第一个队列中提取的,那么过一段时间后,对象就会被销毁,但由于指向对象的指针仍然存在于另一个队列中,因此从释放的内存中读取数据时会发生错误。
如何在不编写自己的数据结构的情况下通过标准STL容器来解决这个问题?
我相信您正在寻找boost::multi_index
,它是一个可访问的单个容器,但有多个不同的"视图":http://www.boost.org/doc/libs/1_59_0/libs/multi_index/doc/index.html
我认为您可以使用std::set
,并在从第一个集合中提取数据后立即从第二个集合中删除条目。在性能方面,两者都提供O(log(n))查找和插入。我不确定这是否是你想要的,但我会试试
//Use std::set as your priority queue instead
set<A*, ComparatorForFindingLightestObjects> qL;
set<A*, ComparatorForFindingHardestObjects> qH;
auto it=qL.begin(); //The first element
if(it!=aL.end())
{
A* curr=*it;
qL.erase(curr); //Delete it from this
qH.erase(curr); //Delete this from the other queue as well
}
此外,我认为您可以合并两个队列或其他什么,只维护一个容器。您可以分别通过*containerName.begin()
和*containerName.rbegin()
访问最小和最大元素