Pergunta de entrada de apagamento do conjunto C ++
Pergunta
Eu encontrei um problema aqui. Estou usando o multiset C ++. Este é o arquivo de teste.
Score: 3-1
Ben
Steven
Score: 1-0
Ben
Score: 0-0
Score: 1-1
Cole
Score: 1-2
Ben
Estou usando o While Loop e o IFStream (FIN1) para ler no arquivo de teste acima.
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);
}
}
}
Estou inserindo todos os nomes no MySet (independentemente de vitórias/perdas/desenhos) na minha última declaração. Mas eu só preciso dos nomes daqueles jogos que venceram/desenham.
Aqueles nomes cujas partidas perderam não serão incluídas no MySet. No arquivo de teste acima, há apenas uma partida que perdeu (1-2) e eu queria remover "Ben". Como eu posso fazer isso?
Tentei usar myset.erase (), mas não tenho certeza de como obtê -lo apontando para Ben e removê -lo do MySet.
Qualquer ajuda é muito apreciada. Obrigado.
Solução
Se eu entendi o que você está tentando fazer, acho que seria mais fácil lembrar se a equipe havia vencido, desenhado ou perdido quando você leu a linha "Score" e apenas insira as seguintes linhas (ou seja. "Ben") se A equipe não perdeu. Inserir a todos e depois apagar aqueles que você não queria parece ser supercomplicado para mim :)
Para referência: se você precisar apagar, você usaria o find()
membro para localizar uma entrada correspondente a uma determinada chave e depois erase()
no iterador devolvido para excluí -lo (depois de verificar isso find()
não retornou um iterador igual a end()
, o que significa que o item não foi encontrado).
Além disso, você não deve passar begin()
para insert()
. O iterador é uma dica de onde o mapa pode inserir o item; Na prática, isso raramente é útil. Há uma sobrecarga dessa função que leva apenas um argumento, o item a ser inserido.
Outras dicas
Crie um Score
classe. Adicione um não-membro operator>>()
Então você pode analisá -lo facilmente. Então será fácil para você decidir se deve inserir um Score
Objeto no conjunto ou não:
if( scr.gained - scr.lost >= 0 )
myset.insert(myset.begin(), scr);