0

私はたくさん検索しましたが、これがクエリが繰り返されているかどうかはわかりませんが、これstd::vector参照として使用して、次のタイプのデータを取る私のソートを作成しました。

typedef struct {
    int size;
    int type;
    int id;
} AC; 

基準ごとに個別の関数オブジェクトを作成できました。sizeただし、私のプロジェクトの要件では、 、 、に従ってソートするためのすべての関数オブジェクトを含めるには、クラスまたは構造体が 1 回だけ必要であるtypeと述べていますid。すべての関数オブジェクトをstd::sort1 つのクラスに含めることは可能ですか?

私は次のようなことを意味します

Comparator com;
sort(iVec.begin(),iVec.end(),com.sortbysize);
sort(iVec.begin(),iVec.end(),com.sortbytype);
sort(iVec.begin(),iVec.end(),com.sortbyid);

要件を満たすためにも調べましbinary_functionsたが、単一のクラスで複数の関数オブジェクトを宣言すると、エラーが発生しました。

std::sortさらに、(さらに言えば、比較を含む STL アルゴリズム) の関数オブジェクトが必要であるbool operator()か、またはそれらが通常の関数を返す必要がありboolますか?

4

2 に答える 2

4

両方にはい:

struct Comparator
{
    static bool sortbysize(const AC &lhs, const AC &rhs) { /*...*/ }
    static bool sortbytype(const AC &lhs, const AC &rhs) { /*...*/ }
    static bool sortbyid(const AC &lhs, const AC &rhs) { /*...*/ }
}
于 2012-10-18T23:37:00.573 に答える
1

はい、クラスが必要な場合は、静的関数を定義できます。

class MyComparator {
    public:
        static bool sortbysize( const AC & elem1, const AC & elem2 ){ ... }
        static bool sortbytype( const AC & elem1, const AC & elem2 ){ ... }
        static bool sortbyid  ( const AC & elem1, const AC & elem2 ){ ... }
}

次に、静的関数を呼び出すための適切な構文を使用して並べ替えを使用します。

sort(iVec.begin(),iVec.end(),MyComparator::sortbysize);

通常の比較可能なクラススタイルに従うことを本当に好む場合は、比較演算子がどのように機能するかを指定するクラス内の静的マーカーを使用するなどのことを行うことができます(少しばかげているように見えますが)。

typedef struct {
    int size;
    int type;
    int id;

    enum marker { SIZE, TYPE, ID };
    static AC::marker comparisonType;

    bool operator() (const AC & i,const AC & j) 
    { 
        // Work here to make the enum thing work with the switch-case... 
        // it's all about integers
        switch(AC::comparisonType){
        case SIZE:
            return (i.size < j.size);
        ...
        }
    }
} AC; 
于 2012-10-18T23:39:32.160 に答える