2012-04-07 6 views
1

可能な限りコードの重複を避けたい。 bool T :: operator <(const T&right)のようなメンバ関数をbinary_functionに変換することは可能ですか?

std::sort(SomeContainer.begin(), SomeContainer.end(), FuncAdaptedFromOp); 

これはStackOverflowの中に私の非常に最初の質問ですが、

class T { 
    int val; 
    bool operator < (const T& right) const { return val < right.val; } 
} 

は、私はこのようなのstd ::並べ替え()を呼び出すことができるようにしたい、私のようなクラスがあるとします。許してください。

EDIT

問題は、クラスが複数bool T::Compare (const T& right)機能を有していてもよいということです。私はまだアダプタが好きです。時々私は、ソースVertexで、時には先Vertexによってソートしたい

class Edge { 
    Vertex u, v; 
    bool CompareSrc (const Edge& right) const { return u < right.u; } 
    bool CompareDest (const Edge& right) const { return v < right.v; } 
} 

、この例を見てみましょう。私はこれが可能かどうかを知りたいだけです。

答えて

1
using namespace std::placeholders; 
std::sort(SomeContainer.begin(), SomeContainer.end() 
    // or use &Edge::CompareDest if you want that instead 
    , std::bind(&Edge::CompareSrc, _1, _2)); 

std::bindあなたの実装がそれを持っている場合TR1からboost::bind(あなたが前のusingディレクティブを使用してはならない。その場合には)またはbindを使用する場合がありますので、しかしC++ 11です。それ以外の場合は、自分のファンクタを手渡すようにアドバイスします。

+0

ありがとうございます。これはまさに私が望んでいたものです。 – Hindol

1

あなただけstd::lesshttp://www.cplusplus.com/reference/std/functional/less/

template <class T> struct less : binary_function <T,T,bool> { 
    bool operator() (const T& x, const T& y) const 
    {return x<y;} 
}; 

STLファンクタを複製少ないと例:

#include <iostream> 
#include <functional> 
#include <algorithm> 

struct my_struct { 
    int a; 
    bool operator< (const my_struct &s) const { 
     return a < s.a; 
    } 
}; 

int main() { 
    my_struct array[10]; 

    for (int i = 0; i < 10; ++i) 
     array[i].a = 10 - i; 

    std::sort(array, array + 10, std::less<my_struct>()); 

    for (int i = 0; i < 10; ++i) 
     std::cout << array[i].a << ", "; 
} 

あなたはそれを記述する必要はありません。 アルゴリズムstd::sortには2つのバージョンがいる:あなたのクラスはoperator <を提供する場合

template <class RandomAccessIterator> 
    void sort (RandomAccessIterator first, RandomAccessIterator last); 

template <class RandomAccessIterator, class Compare> 
    void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp); 

最初のバージョンは(匹敵する)を使用することができます。 operator <を使用したくない場合、または存在しない場合は、2番目のバージョンが使用されます。以下無し

例:

#include <iostream> 
#include <functional> 
#include <algorithm> 

struct my_struct { 
    int a; 
    bool operator< (const my_struct &s) const { 
     return a < s.a; 
    } 
}; 

int main() { 
    my_struct array[10]; 

    for (int i = 0; i < 10; ++i) 
     array[i].a = 10 - i; 

    std::sort(array, array + 10); 

    for (int i = 0; i < 10; ++i) 
     std::cout << array[i].a << ", "; 
} 

例は、同じ結果を有します。

また、他の関数を使用して、std::greaterなどのソートアルゴリズムの動作を変更することができます。

+0

正確には私が望んでいたものではありません。申し訳ありませんが、私の質問はもっと早いほど明確ではありませんでした。 – Hindol

関連する問題