我在这里遇到了一个问题。我正在使用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中删除。
非常感谢任何帮助。 感谢。
答案 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()
。迭代器是一个关于地图可能插入项目的提示;在实践中,这很少有用。该函数有一个重载,它只接受一个参数,即要插入的项。