سؤال

واجهت مشكلة هنا. أنا أستخدم C ++ Multiset. هذا هو ملف الاختبار.

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 (بغض النظر عن الانتصارات/الخسائر/السحب) في آخر بيان آخر. لكنني فقط بحاجة إلى أسماء تلك المباريات التي فازت/رسم.

لن يتم تضمين الأسماء التي فقدت مبارياتها في Myset. في ملف الاختبار أعلاه ، هناك مباراة واحدة فقط فقدت (1-2) وأردت إزالة "Ben". كيف أقوم بذلك؟

حاولت استخدام myset.erase () ، لكنني لست متأكدًا من كيفية الوصول إلى Ben وإزالته من MySet.

أي مساعدة هي محل تقدير كبير. شكرًا.

هل كانت مفيدة؟

المحلول

إذا فهمت ما تحاول القيام به ، أعتقد أنه سيكون من الأسهل أن نتذكر ما إذا كان الفريق قد فاز أو رسم أو خسر عند قراءة خط "النتيجة" وإدراج الأسطر التالية فقط (أي. "بن") إذا لم يخسر الفريق. يبدو أن إدخال الجميع ثم محو تلك التي لم تكن تريدها تبدو مبالغة بالنسبة لي :)

للإشارة: إذا كنت بحاجة إلى محو ، فستستخدم find() عضو لتحديد موقع إدخال مطابق لمفتاح معين ، ثم erase() على المتكرر الذي تم إرجاعه لحذفه (بعد التحقق من ذلك find() لم يعيد جهاز التكرار end(), ، مما يعني أنه لم يتم العثور على العنصر).

أيضا ، يجب ألا تمر begin() إلى insert(). التكرار هو تلميح إلى المكان الذي قد تقوم فيه الخريطة بإدراج العنصر ؛ في الممارسة العملية نادراً ما يكون مفيدًا. هناك حمولة زائدة من هذه الوظيفة التي تأخذ وسيطة واحدة فقط ، العنصر لإدراجه.

نصائح أخرى

إنشاء Score صف دراسي. أضفه غير عضو operator>>() حتى تتمكن من تحليلها بسهولة. عندها سيكون من السهل عليك أن تقرر ما إذا كنت ستحدد أ Score اعتراض في المجموعة أم لا:

if( scr.gained - scr.lost >= 0 )
    myset.insert(myset.begin(), scr);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top