2016-05-06 4 views
2

ソートアルゴリズムを使用してクライアントのvectorをソートしたいが、問題は2つの異なる条件で並べ替えることだ。同じ演算子とクラスの2つのオーバーロード関数

これを画面に表示してファイルに保存するには、IDで並べ替える必要がありますが、他のもの(トップ10の最悪のクライアントを知っているようなもの)に使用するには、彼らが費やしたお金の

これらはクライアントクラスのoperator==のオーバーロード機能ですが、明らかに共存できません。誰かが私にこれのための解決策を与えることができますか? std::sort関数オーバーロードの

class Client 
    { 
    public: 
    //... 
     unsigned int getID() const; 
     double getSum() const; 
    //... 
    private: 
     unsigned int ID; 
     //... 
     double sum; 
    }; 

    bool operator==(const Client &LHS, const Client &RHS) 
    { 
     return (LHS.getID() == RHS.getID()); 
    } 

    bool operator==(const Client &LHS, const Client &RHS) 
    { 
     return (LHS.getSum() == RHS.getSum()); 
    } 
+0

彼らは名前のメンバ関数を作りますか? – NathanOliver

+2

明示的コンパレータでソートすることができます。 – user2357112

+0

演算子==は単なる例で、明らかにソートアルゴリズムも他のものを使用します(< and >) –

答えて

5

1つの比較器をとり、各インスタンス化のために、そのフォームを使用し、二つの独立した機能またはファンクタ(またはラムダ)とそれを提供します。

class Client 
{ 
public: 
    //... 
    unsigned int getID() const; 
    double getSum() const; 
    //... 
private: 
    unsigned int ID; 
    //... 
    double sum; 
}; 

bool CompareByID(const Client &LHS, const Client &RHS) 
{ 
    return (LHS.getID() < RHS.getID()); 
} 

bool CompareBySum(const Client &LHS, const Client &RHS) 
{ 
    return (LHS.getSum() < RHS.getSum()); 
} 

// ... 
std::sort(container.begin(), container.end(), CompareByID); 

ソートは通常、それが要素を注文するより少ない比較を使用して、その順序付けの要件に従うの比較が必要です。正確な比較は異なる場合がありますが、同じ注文条件に従う必要があります(詳細は、std::sortアルゴリズムの情報を参照し、this on厳密な弱い注文の情報を参照してください)。

+0

ありがとうございました。私はそれを考えなかったとは信じられない! –

+1

あなたは確かに 'std :: sort'の述部としてこれらの関数を使うことはできません。 –

+0

@BenjaminLindley。くそー。内部比較を更新しませんでした。更新されました。 – Niall

0

あなたはstd:sortアルゴリズムを使うことができます。 sumとidの比較のためにそれぞれ2つの関数を作成し、比較のための関数ポインタとして渡す必要があります。

bool compare_by_ID(const Client &LHS, const Client &RHS) 
{ 
     return (LHS.getID() < RHS.getID()); 
} 


bool compare_by_sum(const Client &LHS, const Client &RHS) 
{ 
     return (LHS.getSum() < RHS.getSum()); 
} 

、あなたは別に比較関数からあなたはファンクタまたは関数オブジェクトを使用して、より洗練されたアプローチを使用することができ、このように

vector<Client> v; 
// assume v contains list of clients. 

// for comparison by sum 
std:sort(v.begin(),v.end(),compare_by_sum); 

// for comparison by Id 
std:sort(v.begin(),v.end(),compare_by_ID); 

をソートを起動する必要がそれらを使用します。代わりにあなたのソートを行うためにオペレータ<に頼るので、明示的にはstd ::ソートするのコンパレータを渡すことができ

+0

述部を引数として取ることができるより優れたソートアルゴリズムがありますか? –

0

std::vector<Client> vec; 
... 
auto sortByID = [](auto lhs, auto rhs){ return lhs.getID() < rhs.getID(); }; 
std::sort(vec.begin(), vec.end(), sortByID); 
//vec is now sorted by ID 

auto sortBySum = [](auto lhs, auto rhs){ return lhs.getSum() < rhs.getSum(); } 
std::sort(vec.begin(), vec.end(), sortBySum); 
//vec is now sorted by Sum 
関連する問題