13

我正在用 C++ 编写一个程序,我想定义我的一个班级的优先级队列。我需要它通过类成员变量之一来比较对象。我使用了 operator< 重载,但我知道还有第二种方法可以实现这一目标 - 使用队列定义定义的特殊函数。哪种方式更好、更美观、更高效?以及如何编写这样的函数?

我已经这样做了:

#include <iostream>
#include <queue>
using namespace std;

class Human {

    public:
        string name;
        int age;
        Human(string name, int age);
};

Human::Human(string name, int age) : name(name), age(age) {}

bool operator<(Human a, Human b) {return a.age < b.age ? true : false;}

int main() {

    Human p1("Child",5);
    Human p2("Grandfather",70);
    Human p3("Older son",20);
    Human p4("Father",40);
    Human p5("Younger son",10); 

    priority_queue<Human> Q;

    Q.push(p1);
    Q.push(p2);
    Q.push(p3);
    Q.push(p4);
    Q.push(p5);

    while(!Q.empty()) {

        cout << "Name: " << Q.top().name << ", age: " << Q.top().age << endl;
        Q.pop();
    }
    return 0;
}
4

3 回答 3

9

风格

如果您的类型具有内在的“自然”顺序,则使用内置运算符表示它是合理的。

如果排序因您使用类型的方式而异(例如,您有一个按年龄排序的 Human 集合,一个按身高排序,一个按 IQ 排序),那么说排序是容器的属性而不是方式。


执行

你可以编写一个自由函数,或者如果你需要状态,可以使用一个仿函数。

请注意,这些都与内置运算符一样适合内联,因此在速度上没有固有的差异(编译器可能更难证明函数指针是可内联的,因此通常首选仿函数)

struct OrderByAge
{
    bool operator() (Human const &a, Human const &b) { return a.age < b.age; }
};
typedef std::priority_queue<Human, std::vector<Human>, OrderByAge> age_queue;
于 2012-12-09T18:28:39.403 回答
2

运算符的重载是最好的方法,因为只执行比较指令,没有什么比这更好的了,所以你的解决方案是最优的。

于 2012-12-09T18:25:43.520 回答
1
#include <iostream>
#include <queue>
#include <iomanip>
#include <cstdlib>
using namespace std;

struct DatenWert {
    int ordnungsnummer;
};

class DaternWert_Compare {
public:
    bool operator()(DatenWert& t1, DatenWert& t2)
    {
       if (t1.ordnungsnummer < t2.ordnungsnummer) return true;
       return false;
    }
};

int main(int argc, char** argv) {

    priority_queue<DatenWert, vector<DatenWert>, DaternWert_Compare> pq;

    DatenWert wert2 = {2};
    DatenWert wert1 = {1};
    DatenWert wert3 = {3};

    pq.push(wert1);
    pq.push(wert2);
    pq.push(wert3);

    while (! pq.empty()) {
       DatenWert t2 = pq.top();
       cout << setw(3) << t2.ordnungsnummer << " " << setw(3) << endl;
       pq.pop();
    }

    return 0;
}

结果:

3 2 1

于 2015-01-29T19:32:47.357 回答