c++ - 访问类私有(private)成员的自定义优先级队列比较器

标签 c++ c++11 stl

如果你看下面的代码,我正在尝试创建一个 priority_queue,我将它命名为 DijkstraPriorityQueue,它有一个自定义比较器,它也使用私有(private) vector 距离

你可以看到我有一些点 ....... 因为我尝试的一切都失败了。

在这种特定情况下,使这项工作按预期进行的最干净的解决方案(或可能的解决方案)是什么?

Dijkstra.h

class Dijkstra
{
public:
    Dijkstra(Graph G, int s);                          // Create
    ~Dijkstra();                                       // Destroy

private:
    bool compare(int u, int v)
    {
        return distTo[u] < distTo[v];
    }
    typedef priority_queue<int, vector<int>, .........> DijkstraPriorityQueue;


    vector<float>         distTo; // distTo[u] is the distance of the shortest s->u path 
    DijkstraPriorityQueue PQ;     // Min-Priority Queue, implemented for Dijkstra
};

Dijkstra.cpp

Dijkstra::Dijkstra(Graph G, int s)
{
     PQ = DijkstraPriorityQueue(...........);
}

最佳答案

选项#1

#include <functional>
#include <queue>
#include <vector>

class Dijkstra
{
public:
    Dijkstra()
        : PQ([this](int u, int v){ return distTo[u] < distTo[v]; })
    {
    }

private:    
    using DijkstraPriorityQueue
       = std::priority_queue<int, std::vector<int>, std::function<bool(int,int)>>;

    std::vector<float> distTo;

    DijkstraPriorityQueue PQ;
};

选项#2

#include <functional>
#include <queue>
#include <vector>

class Dijkstra
{
public:
    Dijkstra()
        : PQ(std::bind(&Dijkstra::compare, this, std::placeholders::_1, std::placeholders::_2))
//      or
//      : PQ([this](int u, int v){ return compare(u, v); })
    {
    } 

private:    
    bool compare(int u, int v) const
    {
        return distTo[u] < distTo[v];
    }

    using DijkstraPriorityQueue
       = std::priority_queue<int, std::vector<int>, std::function<bool(int,int)>>;

    std::vector<float> distTo;

    DijkstraPriorityQueue PQ;
};

选项 #3

(郑重声明,如果您坚持使用 C++03):

#include <queue>
#include <vector>

class Dijkstra
{
public:
    Dijkstra()
        : PQ(compare(this))
    {
    }

private:
    struct compare
    {
        explicit compare(Dijkstra* d) : d(d) {}

        bool operator()(int u, int v) const
        {
            return d->distTo[u] < d->distTo[v];
        }

        const Dijkstra* d;
    };

    typedef std::priority_queue<int, std::vector<int>, compare> DijkstraPriorityQueue;

    std::vector<float> distTo;

    DijkstraPriorityQueue PQ;
};

关于c++ - 访问类私有(private)成员的自定义优先级队列比较器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35667687/

相关文章:

c++ - 检索用户路径环境变量

c++ - 如何优化 n-queens OpenMP 并行程序?

algorithm - find_if 的两个条件

c++ - 静态变量阴影全局

c++ - std::move 在 move 到左值引用时会导致切片吗?

c++ - std::mem_fn(&method_defined_with_forceinline)(*this) 未内联

c++ - 当返回 undefined object 类型引用的 C++ 函数的返回值未赋值时会发生什么?

c++ - 您将如何优化此矢量化的谐波和?

c++ - C++ 中的复合模式

c++ - 删除集合迭代器值并递增迭代器