Вопрос

Я столкнулся с проблемой здесь. Я использую 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 (независимо от Wins / Loses / Draws) в моем последнем выступлете. Но мне нужны только имена этих матчей, которые выиграли / рисуют.

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

Я пытался использовать myset.erase (), но я не уверен, как получить его указать в Бен и удалить его из 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