C++ C++;设置删除条目问题

C++ C++;设置删除条目问题,c++,set,multiset,C++,Set,Multiset,我在这里遇到了一个问题。我使用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(

我在这里遇到了一个问题。我使用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);
        }
    }
}
multiset-myset;
而(!fin1.eof())
{
fin1>>scoreName;
如果(scoreName==“分数:”)
{
//计算播放的比赛数
}
其他的
{
goalCheck=scoreName.substr(1,1);
如果(目标检查=“-”)
{
字符串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)//如果团队获胜
{
//一些计算
}
else if(leftGoal
在我的最后一个else语句中,我正在将所有的名字插入myset(不管赢/输/平局)。但我只需要赢/平局的比赛的名字

在上面的测试文件中,只有一个匹配项丢失(1-2),我想删除“Ben”。我该怎么做

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

非常感谢您的帮助。
谢谢。

创建一个
Score
类。将其添加为非成员
操作符>>()
,以便您可以轻松地对其进行分析。然后,您就可以轻松决定是否将
Score
对象插入集合:

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

如果我明白你想做什么,我想当你看到“得分”线时,你会更容易记住球队是赢了、平局了还是输了,如果球队没有输,就只插入以下几行(即“本”)。插入所有人然后删除你不想要的人对我来说似乎太复杂了:)

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


此外,您不应该将
begin()
传递给
insert()
。迭代器是一个提示,指示映射可以在何处插入项;实际上,这几乎没有什么用处。该函数有一个重载,只需要一个参数,即要插入的项。

但这会将名称插入myset吗?还是仅仅插入“比分:3比1"你可以在
得分
对象中添加一个名字列表,或者你可以用
地图
而不是
集合
,从名字映射到他们的分数。@Peter:是的,你说得对。如果球队赢了或平局,我需要得分球员的名字。如果球队输了,我不需要他们的名字e得分球员的名字。有没有更简单的方法呢?我知道插入所有名字然后删除掉的名字是很复杂的。@华莱士,事实上这一点都不复杂。只是你将设置得很大,然后缩小它,所以这是一个性能损失。要做到这一点,你需要应用删除擦除习惯用法:一行代码。你可以维护一个
bool
标志,指示团队是否获胜或平局,并在团队获胜或平局时将其设置为
true
,如果他们输了则将其设置为
false
。然后仅在该标志为true时插入。显然,你需要在循环外部声明它,这样就不会在循环中每次都重置:)@Wilhelm:I删除名字不需要太多的代码,但他会在插入后立即执行删除操作,因此对我来说,一开始不执行插入操作似乎比担心
erase
@Peter不,他会在将所有分数插入集合后执行删除操作更容易。
myset.erase(scores.begin()、scores.end()、lost())、myset.end();