0

親クラス:

Character

サブクラス:

Elf
Human

私は変数を持っています

int myScore;
string myType;

だから私がしたことは、myTypeでソートしてからスコアの昇順でソートすることでした

このようなレコードを取得した場合を意味します

[1] Human, 99
[2] Elf, 91
[3] Elf, 99
[4] Human, 99

並べ替えれば

[1] Human, 90 
[2] Human, 99
[3] Elf, 91
[4] Elf, 99

2ソートを1ソートにマージできるマージ機能は以前聞いたことがあります。

でもどうやって使うんだろう。

とりあえずやったことは

character.cpp で

struct sort_by_score
{
    static bool operator()(Character* x, Character* y)
    {
        return x->getScore() < y->getScore();
    }
};

main.cpp で

これは私がしました

int main()
{
Character *chara[100];
vector<Character*> sortVector;

//some input of value here.. assuming now got 4 pointers to object, 2 human 2 elf. 

sortVector.clear();
sortVector.assign(chara,chara + characterCounter);

//here i got question on how to sort by Human Then Elf

//2nd sort is sort by score
sort(sortVector.begin(), sortVector.end(), sort_by_score());

for (int i=0;i<characterCounter;i++)
{
cout << sortVector.toDisplay() << endl;
}

return 0;
}

すべての助けをありがとう!!

4

1 に答える 1

1

ラムダ(C ++ 0x / 11)を使用すると、これを非常に簡単に行うこともできます。

vector<Character> v = ...;

sort(v.begin(), v.end(), [](const Character &lhs,const Character & hs){
    return lhs.getType() == rhs.getType() ? lhs.getScore() < rhs.getScore()
                                          : lhs.getType() < lhs.getType();
});

またはポインタの場合:

vector<Character*> v = ...;

sort(v.begin(), v.end(), [](const Character *lhs,const Character * hs){
    return lhs->getType() == rhs.getType() ? lhs->getScore() < rhs->getScore()
                                           : lhs->getType() < lhs->getType();
});

「基準コンバイナー」が見つからなかったので、自分で書きました。これは機能するはずです:

template<class T, class First, class Second>
class combine {
    First first;
    Second second;
public:
    bool operator()(const T & lhs, const T & rhs) const {
        if(first(lhs, rhs)) return true;
        if(first(rhs, lhs)) return false;
        return second(lhs, rhs);
    }
};

2つの基本的な比較ファンクターを使用

struct less_type
{
    static bool operator()(const Character & lhs, const Character & rhs) {
        return lhs.getType() < rhs.getType();
    }
};
struct less_score
{
    static bool operator()(const Character & lhs, const Character & rhs) {
        return lhs.getScore() < rhs.getScore();
    }
};

これは次のように使用できます。

vector<Character*> v = ...;

sort(v.begin(),v.end(), combine<Character,less_type,less_score>());

これは、C++0xラムダをサポートしなくても機能します。

于 2012-11-03T11:15:37.797 に答える