关于比较器的C++模板问题

Sve*_*end 3 c++ templates graph

可能是一个非常新的C++问题.假设我有一个类,顶点,有几个属性和方法.我想把一堆顶点填充到一个队列中,并让它们按顶点类的特殊属性排序(为学校做一个基本的Dijkstra图算法).

但是,我遇到了一些渗透C++语法的问题.这是我的代码(顶点未显示,但它非常简单).

typedef std::priority_queue<benchmark::vertex*, 
                    std::vector<benchmark::vertex*>, 
                    std::less<benchmark::vertex*> > q_type;
q_type* q = new q_type();
benchmark::vertex* v1 = new benchmark::vertex(0.1,0.1);
v1->cost = 4;
benchmark::vertex* v2 = new benchmark::vertex(0.1,0.1);
v2->cost = 8;
benchmark::vertex* v3 = new benchmark::vertex(0.1,0.1);
v3->cost = 6;
benchmark::vertex* v4 = new benchmark::vertex(0.1,0.1);
v4->cost = 10;
benchmark::vertex* v5 = new benchmark::vertex(0.1,0.1);
v5->cost = 2;
q->push(v1);
q->push(v2);
q->push(v3);
q->push(v4);
q->push(v5);
while (!q->empty()) {
    std::cout << (*(q->top())).cost << std::endl;
    q->pop();
}
Run Code Online (Sandbox Code Playgroud)

这在我的本地机器上输出2,10,6,8,4.我正在使用GCC(gcc版本4.3.3(Ubuntu 4.3.3-5ubuntu4))的Linux机器上测试它.显然,我希望它按顺序吐出数字.

我如何制作比较器,以便在进行比较时查看并比较vertex.cost?

Dre*_*ann 9

替换std::less<benchmark::vertex*>为将两个顶点指针作为参数的任何函数或函子,并返回trueiff第一个参数属于第二个参数.

std::less<benchmark::vertex*> 将要比较两个指针,所以你看到的结果显示了它们在内存中的顺序.

  • +1 `bool costFunction(const benchmark::vertex* lhs, benchmark::vertex* rhs) {return lhs-&gt;cost &lt; rhs-&gt;cost;}` (4认同)

Ale*_*tov 5

std::less<benchmark::vertex*> 比较地址而不是顶点

// Functor
struct VertexLess
{
   bool operator (const benchmark::vertex* left, const benchmark::vertex* right) const {
      return left->id < right->id;
   }
};

typedef std::priority_queue<benchmark::vertex*,     
                    std::vector<benchmark::vertex*>,
                    VertexLess > q_type;
Run Code Online (Sandbox Code Playgroud)