我对优先级队列的定义是:
template<typename Node, typename Cmp = std::less<Node> >
struct deref_compare : std::binary_function<Node*,Node*,bool>
{
deref_compare(Cmp const& cmp = Cmp())
: cmp(cmp) {}
bool operator()(Node* a, Node* b) const {
return (a->getfValue()> b->getfValue());
}
private:
Cmp cmp;
};
typedef deref_compare<Node,std::greater<Node> > my_comparator_t;
priority_queue<Node*,vector<Node*>,my_comparator_t> openq;
我在做:
openq.push(myNode)
输入3-4个节点后,我发现了分段错误。
mynode
不是空的。
我该如何解决?
答案 0 :(得分:2)
查看familiar。
不幸的是你搞砸了模板。如果你不想要一个比较指针的通用解决方案,你也可以在没有任何模板魔法的情况下编写你的仿函数:
struct my_compare {
bool operator()(Node const* n1, Node const* n2) const {
return n1->getfValue() > n1->getfValue();
}
};
priority_queue<Node*,vector<Node*>,my_compare> foo;
至于你得到的错误。你没有给我们足够的信息。似乎问题不在于您使用的仿函数。你的代码的其余部分更有可能受到责备。
我也希望你的节点是托管(如在生命周期管理中)一些其他数据结构(例如std :: set),并且它们的存活时间足够长。否则,很容易出错导致内存泄漏或未定义的行为。请记住,自动对象(存在于“堆栈”中的对象)在其范围保留时会被销毁,并且在修改容器后,指向另一个容器内的对象的指针可能会变得无效。查看各种容器对迭代器的保证以及何时/如果迭代器失效。
答案 1 :(得分:1)
我们需要查看插入节点的代码。听起来好像其中一个节点在插入后被销毁了,也许你正在插入一个指向基于堆栈的对象的指针?
此外,这不是问题,但您的cmp
永远不会被使用,您总是在做比较大的事情。