13

私は C++ でプログラムを書いており、自分のクラスの 1 つの優先キューを定義したいと考えています。クラスメンバー変数の1つでオブジェクトを比較するために必要です。operator< オーバーロードを使用しましたが、この目標を達成するための 2 番目の方法があることを知っています - キュー定義で定義された特別な関数です。どちらの方法がより良く、より審美的で、より効率的ですか? そして、そのような関数をどのように書くのですか?

私は次のようにしました:

#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

スタイル

型に固有の「自然な」順序付けがある場合、それを組み込み演算子で表現するのが合理的です。

型の使用方法によって順序が異なる場合 (たとえば、年齢順、身長順、IQ 順で並べ替えられた Human のコレクションが 1 つある場合)、順序付けはコンテナーのプロパティであると言うのが賢明です。タイプ。


実装

フリー関数を作成するか、状態が必要な場合はファンクターを使用できます。

これらは両方とも組み込み演算子とまったく同じようにインライン化に適しているため、速度に固有の違いはありません (ただし、関数ポインターがインライン化可能であることをコンパイラーが証明するのはおそらく難しいため、ファンクターが一般的に好まれます)。

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 に答える