2009-06-01 13 views
0

std :: sortアルゴリズムに関する質問があります。ここに私のテストコードは次のとおりです。std :: sort without functors

struct MyTest 
{ 
    int m_first; 
    int m_second; 

    MyTest(int first = 0, int second = 0) : m_first(first), m_second(second) 
    { 
    } 
}; 


int main(int argc,char *argv[]) 
{ 
    std::vector<MyTest> myVec; 
    for(int i = 0; i < 10; ++i) 
    { 
     myVec.push_back(MyTest(i, i + 1)); 
    } 


    //Sort the vector in descending order on m_first without using stand alone function or functors 


    return 0; 

} 

は、それがどのスタンドアローン機能やファンクタを使用せずに変数m_first上のベクトルをソートすることは可能ですか?また、私はブーストを使用していないことに注意してください。

答えて

10

オペレータ定義2つのMyTestインスタンスを正しく比較してください。あなたはMyTestoperator<を定義する必要があり、それは次のようになります

class MyTest 
{ 
    ... 
    bool operator <(const MyTest &rhs) const 
    { 
    return m_first<rhs.m_first; 
    } 
}; 
+0

これは有効なC++コードではありません。 boolなどを返す必要があります –

+0

oopsが今修正されました –

+0

私はm_secondでソートしたいのであれば、将来は回答者に感謝します。あれは正しいですか? – Naveen

3

構造体に演算子<を記述してください。これは、sortによって使用されるデフォルトの関数であり、カスタムデータ構造上で関数を動作させる最も簡単な方法です。

2

はい、そう長いソートする範囲の値型がoperator <を有するものと言うことである「厳密弱い順序付け」を定義し、それを使用することができる<

struct MyTest 
{ 
... 
    bool operator<(const MyTest& a_test) const { 
     return m_first < a_test.m_first; 
    } 
}; 
+0

オペレータは、1つのパラメータしか取らず、 "this"と比較する必要があります。 – sth

+0

はい、ありがとう! –

1

:あなたが好きな何かをするかもしれません

bool operator<(const MyTest &other) const { 
    return m_first < other.m_first; 
}; 
2

メンバ関数でそれを行うことが可能であるが、スタンドアローン機能があります行く道。

bool operator <(const MyTest &lhs, const MyTest &rhs) 
{ 
    return lhs.m_first<rhs.m_first; 
} 

なぜ..

スコット・マイヤーズ:あなたはメンバーや のいずれかとし 実装することができます機能を書いている場合は非メンバー関数は、カプセル化

を向上させる方法非友人以外のメンバーである場合、 は非会員の 機能として実装することをお勧めします。その決定は、クラスのカプセル化を 増加させます。 カプセル化と考えると、 非メンバ関数と考えるべきです。

Surprised? Read on

-2

http://ideone.com/3QLtP

これにはオペレータ<を定義していないが、ファンクタを定義しません。

しかし、時間やコンパイルの過程を経るのは楽しいことです。

関連する問題