父类:
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;
}
感谢您的帮助!!
答案 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的情况下工作。