c ++

时间:2015-12-10 17:37:01

标签: c++ stl stl-algorithm

我上课了:

class A{
    //fields, methods
;

我需要一个高效的数据结构,允许您从A类最小值和最大值对象的各种指针中进行选择(它应该在线工作,即问题的选择将与添加新poite的请求交替)。这可以通过使用两个优先级队列来完成:

priority_queue<A*, vector<A*>, ComparatorForFindingLightestObjects>* qL;
priority_queue<A*, vector<A*>,  ComparatorForFindingHardestObjects>* qH;

问题是如果从第一个队列中提取对象指针,那么一段时间后对象就会被销毁,但由于指向该对象的指针仍然存在于另一个队列中,因此会发生从释放的内存中读取数据的错误

如何在不编写自己的数据结构的情况下通过标准STL容器解决这个问题?

2 个答案:

答案 0 :(得分:1)

我认为您可以使用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()

访问最小和最大元素

答案 1 :(得分:1)

我相信您正在寻找boost::multi_index这是一个可以访问的单个容器,但有多个不同的视图&#34;:http://www.boost.org/doc/libs/1_59_0/libs/multi_index/doc/index.html