質問
ここで問題に遭遇しました。 C ++マルチセットを使用しています。これがテストファイルです。
Score: 3-1
Ben
Steven
Score: 1-0
Ben
Score: 0-0
Score: 1-1
Cole
Score: 1-2
Ben
上記のテストファイルから読み込むために、ループと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);
}
}
}
私は最後の他のステートメントで(勝利/失敗/ドローに関係なく)マイセットにすべての名前を挿入しています。しかし、私は勝ち/描画する試合の名前のみを必要とします。
マッチが失われた名前はMysetに含まれません。上記のテストファイルには、失われた(1-2)一致が1つしかなく、「ベン」を削除したかったのです。どうやってやるの?
myset.erase()を使用しようとしましたが、ベンをポイントしてMysetから削除する方法がわかりません。
どんな助けも大歓迎です。ありがとう。
解決
あなたがやろうとしていることを理解している場合、「スコア」ラインを読んだときにチームが勝ち、描かれた、または紛失したかどうかを覚えておくのが簡単だと思います。チームは負けていません。みんなを挿入してから、あなたが望んでいないものを消去することは、私に複雑になっているようです:)
参照のために:あなたが消去する必要がある場合、あなたは find()
特定のキーに一致するエントリを見つけるメンバー、そして次に erase()
返されたイテレーターで削除します(それをチェックした後 find()
等しいイテレーターを返さなかった end()
, 、これはアイテムが見つからなかったことを意味します)。
また、合格してはいけません begin()
に insert()
. 。イテレーターは、マップがアイテムを挿入する場所に関するヒントです。実際には、それはめったに有用ではありません。その関数のオーバーロードがあり、挿入するアイテム、1つの引数のみを取得します。
他のヒント
aを作成します Score
クラス。非メンバーを追加します operator>>()
だからあなたはそれを簡単に解析することができます。そうすれば、挿入するかどうかを簡単に決定できます Score
セットにオブジェクトかどうか:
if( scr.gained - scr.lost >= 0 )
myset.insert(myset.begin(), scr);