【发布时间】:2014-09-16 20:01:00
【问题描述】:
我正在尝试使用列表作为包含数据节点对象的优先级队列的底层容器。使用向量或双端队列似乎可以正常工作,但是我尝试使用列表作为底层容器,并且尝试将某些内容推送到队列中,但出现错误:
错误 3 错误 C2784: 'unknown-type std::operator -(std::move_iterator<_ranit> &,const std::move_iterator<_ranit2> &)' : 无法推断出 'std::move_iterator 的模板参数<_ranit> &' 来自 'std::_List_unchecked_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);
}
【问题讨论】:
-
理论上您可以创建一个priority_queue,使用列表作为其底层存储,但性能会很差。在 priority_queue 中,索引 N 处的节点在索引 2N 和 2N+1 处具有子节点,因此从该节点 N 的遍历通常会前进到节点 2N 或 2N+1 之一。您可以使用
std::advance来访问这些节点,但是您通常期望的恒定复杂度操作会变成线性操作,因此 O(N log N) 操作最终会变成 O(N*N) 之类的东西,失去了使用优先级队列开始的大部分原因。 -
正确地说,
NodeComparison::operator()应该是 const 并接受 const 参数。
标签: c++ list priority-queue