2012-02-14 3 views
1

セットにベクトル とカスタムコンパレータをソートするために、同じ機能を使用すると、このことをより良い方法があります: これは愚かな問題のように聞こえるかもしれないが、私は長い間疑問に思い<X>

struct X 
{ 
    int a; 
    int b; 
}; 
bool sortComp(const X first, const X second) 
{ 
    if (first.a!=second.a) 
     return (first.a<second.a); 
    else 
     return (first.b<second.b); 

} 
class setComp 
{ 
public: 
    bool operator() (const X first, const X second) const 
    { 
     if (first.a!=second.a) 
       return (first.a<second.a); 
      else 
       return (first.b<second.b); 
    } 
}; 
int main() 
{ 
    vector<X> v; 
    set<X, setComp> s; 
    sort(begin(v), end(v),sortComp); 
} 

あなたが私を見るように同じ機能を2回、ソート用に1回、セット内で暗黙ソート用に1回実装します。コードの重複を避ける方法はありますか?

+1

'bool演算子(const X first、const X second)const {return sortComp(first、second);}'? – Vladimir

+1

この特定のケースでは、私は構造体Xのための演算子<を実装するので、あなたはセットとソートについてそれを忘れることができます。 – stefaanv

答えて

5

もちろん、どちらか一方を選択してもう一方の呼び出しを変更してください。

// choosing the function object 
sort(begin(v), end(v), setComp()); // create setComp, sort will call operator() 

// choosing the function 
set<X, bool(*)(const X, const X)> s(sortComp); // pass function pointer 

私は個人的にファンクタのバージョンをお勧めします。

+0

ああ、setComp後の()そのようなnoobです。関数のキャスト:(私は大きなファンではありません:)しかし、関数オブジェクトはうまく動作します – NoSenseEtAl

+0

私はあなたが意味するいずれの関数キャストも表示されませんか? – fredoverflow

+0

フレーズに関する私の知識はおそらく悪いです...私はbool(*)(const X、const X)を意味します – NoSenseEtAl

関連する問題