C ++如何进行2排序并将结果合并为1

时间:2012-11-03 11:08:06

标签: c++

父类:

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;
}

感谢您的帮助!!

1 个答案:

答案 0 :(得分:1)

使用lambdas(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);
    }
};

使用两个基本比较函子

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 lambdas的情况下工作。