0

我在这里遇到了一个问题。我正在使用 C++ 多重集。这是测试文件。

Score: 3-1 
Ben
Steven
Score: 1-0 
Ben
Score: 0-0
Score: 1-1 
Cole
Score: 1-2
Ben

我正在使用 while 循环和 ifstream (fin1) 从上面的测试文件中读取。

multiset<string, less<string> > myset;

while(!fin1.eof())
{

fin1 >> scoreName;

if(scoreName == "Score:")                                               
{
    //calculates number of matches played
}
else
{
    goalCheck = scoreName.substr(1,1);
    if(goalCheck == "-")
    {
        string lGoal, rGoal;
        lGoal = scoreName.substr(0,1);
        rGoal = scoreName.substr(2,1);

        int leftGoal, rightGoal;
        leftGoal = atoi(lGoal.c_str());
        rightGoal = atoi(rGoal.c_str());

        if(leftGoal > rightGoal)   //if team wins
        {
            //some computations
        }
        else if(leftGoal < rightGoal)   //if team loses
        {
            //computations
        }
        else if(leftGoal == rightGoal)   //if team draws
        {
            //computations
        }
        else
        {
            myset.insert(myset.begin(), scoreName);
        }
    }
}

我在最后一个 else 语句中将所有名称插入到 myset 中(无论输赢/平局)。但我只需要那些获胜/平局的比赛的名字。

那些匹配失败的名字将不会包含在 myset 中。在上面的测试文件中,只有一场比赛输了(1-2),我想删除“Ben”。我怎样才能做到这一点?

我尝试使用 myset.erase(),但我不确定如何让它指向 Ben 并将其从 myset 中删除。

任何帮助深表感谢。谢谢。

4

2 回答 2

0

创建一个Score类。将其添加为非成员operator>>(),以便您轻松解析它。然后,您将很容易决定是否将Score对象插入集合中:

if( scr.gained - scr.lost >= 0 )
    myset.insert(myset.begin(), scr);
于 2010-05-17T21:39:54.253 回答
0

如果我理解您要做什么,我认为当您阅读“Score”行并仅插入以下行(即“Ben”)时,更容易记住球队是赢了,平局还是输了,如果球队没有输球。插入每个人然后删除你不想要的人对我来说似乎过于复杂:)

供参考:如果您确实需要擦除,您将使用该find()成员来定位与给定键匹配的条目,然后erase()在返回的迭代器上将其删除(检查后find()没有返回等于 的迭代器end(),这意味着该项目没找到)。

另外,你不应该传递begin()insert(). 迭代器是关于地图可能在哪里插入项目的提示;在实践中,这很少有用。该函数有一个重载,它只接受一个参数,即要插入的项目。

于 2010-05-17T21:44:47.927 回答