c++中相同指针的两个优先级队列



我有类:

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()访问最小和最大元素

相关内容

  • 没有找到相关文章

最新更新