C ++设置擦除条目问题

时间:2010-05-17 21:31:32

标签: c++ set multiset

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

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

我在my last else语句中将所有名称插入myset(无论胜/输/抽奖)。但是我只需要赢得/抽签的那些比赛的名字。

匹配丢失的名称不会包含在myset中。在上面的测试文件中,只有一个丢失的匹配(1-2),我想删除“Ben”。我怎么能这样做?

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

非常感谢任何帮助。 感谢。

2 个答案:

答案 0 :(得分:0)

创建一个Score课程。添加一个非成员operator>>(),以便您可以轻松解析它。然后,您可以轻松决定是否将Score对象插入到集合中:

if( scr.gained - scr.lost >= 0 )
    myset.insert(myset.begin(), scr);

答案 1 :(得分:0)

如果我理解你要做的事情,我认为当你阅读“得分”线并且只插入以下几行(即“Ben”)时,会更容易记住球队是赢了,抽签还是输了。 “)如果球队没有输球。插入所有人然后删除你不想要的那些似乎对我来说过于复杂:)

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

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