c++ - 在 STL make_heap c++​​ 中将函数指针作为比较器传递

标签 c++ stl heap function-pointers pointer-to-member

我正在开发此程序以使用堆实现运行 Dijkstra 算法,我希望它尽可能多才多艺,因此我使用函数指针以避免代码重复。这是它弹出的错误。我正在使用 STL make_heap

"Type must use '.*' or '->*' to call pointer-to-member function in '__comp (...)', e.g. '(... ->* __comp) (...)' "heap.h     C/C++ Problem

这是 Dijkstra 的算法:

void Graph::dijkstraAlg(Vertex* ini, Vertex* fin, void(Graph::*weight_filler)(void), bool(Graph::*pq_order)(const Vertex* &, const Vertex* &)){

for(unsigned int i = 0; i < vertexs.size(); i++) {
    vertexs[i]->path = NULL;
    vertexs[i]->holder = MAX_INT_VALUE;
    vertexs[i]->processing=false;
}

(this->*weight_filler)();

Vertex* v=ini;
v->holder = 0;
v->processing = true;

vector<Vertex*> pq;
pq.push_back(v);
make_heap(pq.begin(),pq.end(),pq_order);

while(!pq.empty()){

    v=pq.front();
    pop_heap(pq.begin(),pq.end());
    pq.pop_back();

    for(unsigned int u=0; u < v->adj.size(); u++){

        Vertex* w = v->adj[u]->dest;

        if((v->holder+v->adj[u]->weight) < w->holder){

            w->holder=v->holder + v->adj[u]->weight;
            w->path=v;

            if(!w->processing){

                w->processing=true;
                pq.push_back(w);
            }
        }

        make_heap(pq.begin(),pq.end(),pq_order);
    }
}

return;}

错误在 make_heap 中,我无法弄清楚,感谢任何帮助。

这是我传递给 make_heap 的函数:

bool Graph::regular_PqOrder(const Vertex* &v, const Vertex* &u){
return v->holder > u->holder;}

这就是我对算法的称呼:

dijkstraAlg(i,f,&Graph::price_WeightFiller,&Graph::regular_PqOrder);

如果您需要更多信息,请告诉我,我会进行编辑。 谢谢小伙伴

最佳答案

您传递的类型错误。 std::make_heap取一个仿函数作为第三个元素,应该满足Compare的要求,这是你需要的:

bool operator()(const Type1&, const Type2&) const;

您正在传递 pq_order 类型:

bool(Graph::*)(const Vertex* &, const Vertex* &)

这是一个指向成员的指针,如果没有 Graph 类型的对象,它是不可调用的。因此,有关“类型必须使用‘.’或‘->’来调用指向成员的指针”的错误。最简单的方法是简单地提供该对象,在您的情况下是 this:

using namespace std::placeholders;
std::make_heap(pq.begin(), pq.end(), 
    std::bind(pq_order, this, _1, _2));

或者,由于 regular_PqOrder 实际上并不依赖于 Graph 的其他方法的任何成员,您也可以将其设为静态:

class Graph { 
public:
    static bool regular_PqOrder(const Vertex* &v, const Vertex* &u) 
    {
        return v->holder > u->holder;
    }
};

现在将 Graph::regular_PqOrder 作为函数指针而不是方法指针传入。

关于c++ - 在 STL make_heap c++​​ 中将函数指针作为比较器传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805915/

相关文章:

c++ - Codeforces 测试服务器错误,无法在本地机器上重现

c++ - 检查子集是否包含给定子集列表的快速方法

java - 使用java的数组和链表的堆接口(interface)

C++ 优先级队列声明

c++ - aspect c++ 跟踪函数控制流和输入输出参数

c++ - 尝试将指针与结构一起使用时出错

c++ - 在 libcurl 中从内存上传图像

c++ - 将 String^ 转换为 const char*

C++编译失败,错误: no member named 'snprintf' in namespace 'std'

java - 如果已添加项目的值发生变化,如何管理堆(最小堆)