我正在尝试用C ++创建一个简单的win32控制台应用程序,它将计算有多少匹配具有相同的分数。
例:
匹配一个分数是1:1
比赛两个得分是1:1
比赛三分为1:2
程序应在控制台中打印:
有2场比赛,得分1:1
有1场比赛,得分1:2
我创建了" match
"宾语。
class match
{
public:
int hostScore;
int guestScore;
match();
~match();
void input();//This method is to input data in the object.
};
现在我想创建函数来计算具有相同分数的匹配。
void count(list<match> a)
{
match game;
int counter;
do{
game = a.front(); // I want to take the value of the first element in the list and assign it to "game".
do{
a.deleteSpecificValueOnlyOneTime(game);// I want to delete list element with the value of "game" 1 time
counter++
} while (I can DeleteSpecificValuesOneTime)
cout<<"There are <<counter<<" matches with score <<game.hostScore<< ":" << game.guestScore<<endl;
counter = 0;
} while (a != a.Empty();)// While a is not empty.
}
我们的想法是从列表中的第一个元素中获取值,删除它一次,计算它,然后重复该过程,直到删除所有具有相同值的元素并计算发生的时间。
取第n个元素的值并执行相同的操作。
答案 0 :(得分:0)
你可以在while循环中使用erase方法:
std::list<match>::iterator it = a.begin();
while (it != a.end())
{
if (*it EQUALS game)
it = a.erase(it);
}
else {
it++;
}
}
答案 1 :(得分:0)
最简单的选择是将所有元素放在一个集合中,然后将它们检索回列表。
为了能够这样做,你必须为匹配定义一个less运算符:
bool operator<(const match &lhs, const match &rhs){
if(lhs.hostScore==rhs.hostScore){
return lhs.guestScore<rhs.guestScore;
}
return lhs.guestScore<rhs.guestScore;
}
之后你几乎快完成了:
void make_elements_unique(std::list<match> &games){
std::set<match> unique;
//put all elements into the set:
unique.insert(games.begin(), games.end());
//clear list and copy all elements from the set to the list, they are unique:
games.assign(unique.begin(), unique.end());
}
如果你寻找性能并且有很多游戏,那么unordered_set(c ++ 11)将是比std :: set更好的选择。