C ++ Set Erase Entry Question - PullRequest
       32

C ++ Set Erase Entry Question

0 голосов
/ 18 мая 2010

Я столкнулся с проблемой здесь. Я использую C ++ multiset. Это тестовый файл.

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);
        }
    }
}

Я вставляю все имена в myset (независимо от выигрышей / проигрышей / ничьих) в моем последнем утверждении else. Но мне нужны только имена тех матчей, которые выиграли / сыграли вничью.

Те имена, чьи совпадения проиграны, не будут включены в myset. В приведенном выше тестовом файле потеряно только одно совпадение (1-2), и я хотел удалить «Бен». Как я могу это сделать?

Я пытался использовать myset.erase (), но я не уверен, как заставить его указать на Бен и удалить его из myset.

Любая помощь очень ценится. Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 мая 2010

Если я понимаю, что вы пытаетесь сделать, я думаю, что было бы легче вспомнить, выиграла ли команда, сыграли ли вничью или проиграли, когда вы прочитали строку «Оценка» и вставили только следующие строки (т. Е. «Бен» ") если команда не проиграла. Вставить всех и затем стереть ненужные мне кажется слишком сложным:)

Для справки: Если вам нужно стереть, вы должны использовать элемент find(), чтобы найти запись, соответствующую данному ключу, а затем erase() на возвращенном итераторе, чтобы удалить его (после проверки, что find() didn не возвращает итератор, равный end(), что означает, что элемент не найден).

Кроме того, вы не должны передавать begin() на insert(). Итератор является подсказкой относительно того, куда карта может вставить элемент; на практике это редко полезно. Существует перегрузка этой функции, которая принимает только один аргумент - элемент для вставки.

0 голосов
/ 18 мая 2010

Создать класс Score. Добавьте его не-член operator>>(), чтобы вы могли легко его проанализировать. Тогда вам будет легко решить, вставить ли в набор объект Score или нет:

if( scr.gained - scr.lost >= 0 )
    myset.insert(myset.begin(), scr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...