2012-03-17 8 views
2

ボックスを表すオブジェクトがあるとします。複数の方法で比較できるオブジェクトをC++で設計する

class Box { 
    public: 
    int length; 
    int width; 
    int height; 

    Box(int l, int w, int h); 
    ~Box(); 
    int area(const int l, const int w) const; 
    int volume(const int l, const int w, const int h) const; 
}; 

は、今、私たちはnボックスが含まれているstd::list<Box>を持って、別のファイルでは、別のクラスに言うことができます。私たちは、これらのボックスからさまざまな方法でプリントアウトしたいと考えています。

  • まず、長さの順にサイズを大きくして印刷したいと考えています。
  • 次に、幅が増える順に印刷します。
  • 私たちは今は身長について気にしませんが、後でそれをするつもりです。

std::listには、比較機能を引数とするメンバー関数sort()があります。上記のBoxクラスを変更して、異なる比較関数を使用してsort()をリストに追加するにはどうすればよいですか?

具体的には、ボックスクラス内で3つの異なる関数を定義し、単にそれらをlist.sort()に渡すことはできますか?比較関数をクラス外でグローバルに定義する方がよいでしょうか?直感的にクラスにそれらを結び付ける方が良いようですが、なぜそうではないでしょうか?全体的に、これを達成するための「最良の」方法は何ですか?

+0

bool my_sort_function (const Box& box1, const Box& box2) { // use some criteria and return a boolean (true if box1 goes before box2) // ... } 

すると、次のようにsort()メソッドを呼び出しますリスト/ソート/ – gbulmer

+0

特に、頻繁に使用する場合は、各注文ごとに別々のリストを保管することが最適かもしれません。 –

答えて

3

あなたが本当にメンバーとして三つの異なる比較 操作を実装したい場合には、このような何か行うことができます。

struct Box { 
    int x, y, length; 

    bool less_by_x(const Box& other) { return this.x < other.x; } 
    bool less_by_y(const Box& other) { return this.y < other.y; } 
    bool less_by_length(const Box& other) { return this.y < other.y; } 
}; 

をし、このようにそれらを使用します。

#include <functional> 
// you probably shouldn't be using a list anyway 
std::list<Box> l; 
l.sort(std::mem_fun_ref(&Box::less_by_x)); 

mem_fun_refバイナリ関数を返します関数がメンバであるクラスとそれ以外のすべての引数(C++ 11のみ、これはC++ 03のバイナリ関数に限定されています)をメンバー関数のクラスに参照するオブジェクトです。

操作をフリー関数として実装する方がはるかに合理的ですが。

+0

私はリストを使用しています。なぜなら、この段階に入ってからボックスを表示する前に、私はそれらを通過し、大きすぎるか小さすぎるものを廃棄するかもしれないからです。 – mcorley

+0

私は、比較演算を自由関数ではなくメンバとして実装することについて厳密ではありません。私は、外部のグローバル関数ではなく、クラスの一部としてそれらを含める方が良いと考えました。私の思考が間違っていて、この提案がより良い場合、私はこのようにすることを歓迎します。 – mcorley

+0

メンバーとしての実装は、カプセル化を維持するので、より良いはずです。 –

0

あなたがパラメータとしてメンバ関数を渡したい場合は、あなたの最良のオプションは、boost::mem_fn

+0

私は訂正しました。答えを編集します。 –

0

std::list::sort()は、カスタムの並べ替え基準を定義することができます比較関数オブジェクトを、受け入れる使用することです。これは通常の関数(フリー関数または静的メンバ)または互換性のあるクラスのインスタンス(operator())です。詳細および例については、some documentationを参照してください。

0

標準C++ライブラリのさまざまなソート機能は、比較オブジェクトを使用します。これらには、必要なデータを含めることができます。彼らが持っている主要な要件は、それらがコピー可能であり、その関数呼び出し演算子が引数型のオブジェクトに適用されたときにstrickt弱い順序をもたらすということです。比較オブジェクトを作成することは容易である。オブジェクトに属性をマップするために使用されるメンバ関数へのポインタを格納します。特に、すべての属性が同じ型を持つ場合(属性に異なる型がある場合は、面白くなります)。これにより、同じリストを異なる順序で並べ替えることはむしろ単純です。

0

これを行う最も良い方法は、各パラメータの比較関数を実装し、並べ替えを呼び出すときに並べ替えに渡すことです。 その関数ブール比較(Box a、Box b)は< bと等価でなければなりません。つまり、そのパラメータでソートするときにaがbより前に来ると真となります。

1

コンパレータ関数(または関数オブジェクト)を指定する必要があります。たとえば:http://www.cplusplus.com/reference/stl/:私は、これはそれを達成する1つの方法を説明して考える

my_list.sort (my_sort_function); 
関連する問題