C++ 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(
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();