C++ 具有列表容器的优先级队列

C++ 具有列表容器的优先级队列,c++,list,priority-queue,C++,List,Priority Queue,我试图使用列表作为优先级队列的底层容器,该队列包含datanode对象。使用vector或deque似乎可以很好地工作,但我尝试使用列表作为底层容器,并尝试将某些内容推送到队列中,我得到了错误: 错误3错误C2784:“未知类型std::operator-std::move\u iterator&”,const std::move\u iterator&”:无法从“std::\u List\u unchecked\u iterator>>”推断“std::move\u iterator&”的模板

我试图使用列表作为优先级队列的底层容器,该队列包含datanode对象。使用vector或deque似乎可以很好地工作,但我尝试使用列表作为底层容器,并尝试将某些内容推送到队列中,我得到了错误:

错误3错误C2784:“未知类型std::operator-std::move\u iterator&”,const std::move\u iterator&”:无法从“std::\u List\u unchecked\u iterator>>”推断“std::move\u iterator&”的模板参数

struct datanode{
    int depth;
    int cost;
    const int SIZE = 10;
    int ident[9];   
    int parent;
    datanode(int dep, int id[9], int);
    datanode(int dep, int id[9], int, int);
    datanode(const datanode&);
    datanode(); 
    datanode& datanode::operator=(const datanode&);
};

class NodeComparison
{
  public:
    bool operator() (datanode& da, datanode& db)
    {
        return da.cost > db.cost;
    }
};

int main(){
    std::priority_queue<datanode,list<datanode>, NodeComparison> PQueue;
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    datanode d(0,a,0);
    PQueue.push(d);
 }

§23.6.4[优先级队列]/p1:

具有随机访问迭代器和支持 操作前、推后和弹出后可用于 实例化优先级队列


std::list没有随机访问迭代器。

§23.6.4[优先级.队列]/p1:

具有随机访问迭代器和支持 操作前、推后和弹出后可用于 实例化优先级队列

std::list没有随机访问迭代器。

理论上,您可以创建一个优先级队列,使用列表作为其底层存储,但性能会非常差。在优先级_队列中,索引N处的节点在索引2N和2N+1处具有子节点,因此从该节点N进行的遍历通常前进到节点2N或2N+1中的一个。您可以使用std::advance访问这些节点,但是您通常期望的恒定复杂度操作将变成线性操作,因此ON log N操作最终将类似于ON*N,失去了使用优先级队列开始的大部分原因。正确地说,NodeComparison::operator应该是const并接受const参数。理论上,您可以创建一个优先级队列,使用列表作为其底层存储,但性能会非常差。在优先级_队列中,索引N处的节点在索引2N和2N+1处具有子节点,因此从该节点N进行的遍历通常前进到节点2N或2N+1中的一个。您可以使用std::advance访问这些节点,但是您通常期望的恒定复杂度操作将变成线性操作,因此ON log N操作最终将类似于ON*N,失去了使用优先级队列开始的大部分原因。正确地说,NodeComparison::运算符应同时为const和take const参数。