0

ここで問題が発生しました。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);
        }
    }
}

最後のelseステートメントで、すべての名前を(勝ち/負け/引き分けに関係なく)mysetに挿入しています。しかし、勝った/引き分けた試合の名前だけが必要です。

一致が失われた名前は myset に含まれません。上記のテスト ファイルでは、1 対 2 で負けた試合が 1 つだけあり、"Ben" を削除したかったのです。どうやってやるの?

myset.erase() を使用しようとしましたが、Ben をポイントして myset から削除する方法がわかりません。

どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

0

クラスを作成しますScoreoperator>>()簡単に解析できるように、非メンバーに追加します。Score次に、オブジェクトをセットに挿入するかどうかを簡単に決定できます。

if( scr.gained - scr.lost >= 0 )
    myset.insert(myset.begin(), scr);
于 2010-05-17T21:39:54.253 に答える
0

あなたが何をしようとしているのか理解できれば、「スコア」の行を読んで、次の行(つまり「ベン」)だけを挿入すると、チームが勝ったか、引き分けたか、負けたかを思い出すのが簡単になると思います。チームは負けていません。全員を挿入してから、不要なものを消去するのは、私には複雑すぎるようです:)

参考までに: 消去する必要がある場合は、find()メンバーを使用して特定のキーに一致するエントリを見つけ、erase()返されたイテレータでそれを削除します (イテレータが返されfind()なかったことを確認した後end()、これはアイテムを意味します)見つかりませんでした)。

begin()また、に渡すべきではありませんinsert()。イテレータは、マップが項目を挿入する場所に関するヒントです。実際には、それが役立つことはめったにありません。1 つの引数 (挿入する項目) のみを取る関数のオーバーロードがあります。

于 2010-05-17T21:44:47.927 に答える