首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入优先级队列时出现分段故障

插入优先级队列时出现分段故障
EN

Stack Overflow用户
提问于 2009-09-26 02:38:21
回答 2查看 1.1K关注 0票数 0

我对优先级队列的定义是:

代码语言:javascript
复制
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; 

我正在做:

代码语言:javascript
复制
openq.push(myNode)

输入3-4个节点后,出现分段故障。

mynode不为空。

我怎么解决它呢?

EN

回答 2

Stack Overflow用户

发布于 2009-09-26 05:20:21

看起来像familiar

不幸的是,你搞砸了模板。如果你不想要一个通用的解决方案来比较指针,你也可以在没有任何模板魔术的情况下编写函数:

代码语言:javascript
复制
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 )管理(就像在生命周期管理中一样),并且它们的寿命足够长。否则,很容易犯导致内存泄漏或未定义行为的错误。请记住,当保留自动对象的作用域时,自动对象(位于“栈”上的对象)将被销毁,并且指向位于另一个容器中的对象的指针在修改容器后可能会变得无效。查看各种容器对迭代器以及何时/如果迭代器无效所做的保证。

票数 2
EN

Stack Overflow用户

发布于 2009-09-26 02:51:13

我们需要查看插入节点的代码。听起来像是其中一个节点在插入后被销毁了,也许你是在插入一个指向基于堆栈的对象的指针?

而且,这不是问题所在,但是你的cmp从来没有被使用过,你总是在做一个大于比较的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1480278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档