質問

ここで問題に遭遇しました。 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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top