运营商LT;优先队列中的错误

时间:2016-05-17 21:34:12

标签: c++ stl priority-queue

我正面临“二进制'<':没有发现哪个运算符采用'const Baloons'类型的左手操作数(或者没有可接受的转换)”错误,我找不到任何解决方案?

我还想问一下如何通过baloon.end订购优先级队列?

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

class Baloons
{
public:
    float start;
    float end;

public:
    Baloons() {}
    Baloons(float start, float end) : start{ start }, end{ end } {}
};

int main()
{
Baloons baloon1(1, 5);
Baloons baloon2(4, 7);
Baloons baloon3(6, 9);
Baloons baloon4(11, 12);
std::priority_queue<Baloons> myBaloons;
myBaloons.push(baloon1);
myBaloons.push(baloon2);
myBaloons.push(baloon3);
myBaloons.push(baloon4);
while (!myBaloons.empty())
{
    Baloons b = myBaloons.top();
    cout << b.start << " -> " << b.end << " ";
    myBaloons.pop();
}
system("pause");
return 0;

}

4 个答案:

答案 0 :(得分:1)

您需要向气球类添加operator<,例如:

bool operator<(const Baloons& rhs) const {
  return std::make_pair(start,end) < std::make_pair(rhs.start,rhs.end);
}

它将用于订购集合中的元素

答案 1 :(得分:0)

优先级队列是已排序的容器,但编译器不知道如何对Baloons进行排序。您必须定义自定义operator<,以便对容器进行排序。

这显然是一个家庭作业问题(很确定这只是为了'myBaloons.pop()&#39;笑话而创造的所以我不想让整件事情消失......在你的Baloons课上添加这样的东西。

bool operator<(const Baloons& rhs) const {
    // return true if this Baloons is less than 'rhs'
}

这样你的Baloons可以比较。 (例如if (baloon1 < baloon2) { /* do stuff */ })优先级队列在插入新对象时在后台进行此比较。

答案 2 :(得分:0)

您需要为operator<提供重载Baloons,否则编译器不知道如何订购std::priority_queue<Baloons>的元素。例如,在Baloons类中定义类似的内容:

bool operator<(const Baloons& _other) const {
    return end < _other.end;
}

或者你想在这里代替return语句进行比较。

答案 3 :(得分:0)

提供bool operator < (const Baloons&, const Baloons&)

bool operator < (const Baloons& lhs, const Baloons& rhs)
{
    return lhs.end < rhs.end;
}

或创建一个仿函数CustomComparer并将其提供给std::priority_queue<Ballons, std::vector<Ballons>, CustomComparer>

struct CustomComparer
{
    bool operator () (const Baloons& lhs, const Baloons& rhs) const
    {
        return lhs.end < rhs.end;
    }
};

以后

std::priority_queue<Ballons, std::vector<Ballons>, CustomComparer> myBaloons;