Вопрос о карте C ++ - PullRequest
       15

Вопрос о карте C ++

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

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

Моя проблема, с которой я столкнулся, заключается в том, что когда я хранил 2 или более «полузащитников» в качестве ключа, даже данные cout отображаются по-разному, но когда я делаю умножение на 2-е -> второе значение, оно «складывает» first -> second value и умножьте на него.

* 1005 Е.Г. *

John   midfielder   1
Steven midfielder   3

У меня есть программа, которая уже читает в playerPosition. Итак, карта выглядит так:

John 1 (Key, Value)
Steven 3 (Key, Value)

if(playerName == a->first && playerPosition == "midfielder")
{
    cout << a->second*2000 << endl;   //number of goals * $2000
}

Итак, по праву программа должна вывести:

2000
6000

Но вместо этого я получаю

2000
8000

Итак, я предполагаю, что это добавляет 1 к 3 (в результате 4) и умножается на 2000, что совершенно неправильно ...

Я попробовал cout a-> first и a-> second в программе и получаю:

John 1
Steven 3

Но после умножения все по-другому. Есть идеи?

Спасибо.


Edit: Хорошо, я стараюсь. Я на самом деле рассчитываю бонус для каждого поля позиции. Я уже вставил данные поля в карту, и вот фактические коды.

multiset<string, less<string> >::iterator q, p = myset.begin();
q = myset.begin()++;

while (p != myset.end())
{        
        if(*p == *q)
        {
            currentScore = (int) myset.count(*p);
            mymap.insert(pair<string, int>(*p, currentScore));
        }
        else if(*p != *q && topScore == 0)
        {
            topScore = (int) myset.count(*q);
            topScorer = *q;
            mymap.insert(pair<string, int>(*q, topScore));
        }
        else if(*p != *q)
        {
            currentScore = (int) myset.count(*p);
            mymap.insert(pair<string, int>(*p, currentScore));

            if(currentScore > topScore)
            {
                topScore = currentScore;
                topScorer = *p;
                mymap.insert(pair<string, int>(*p, topScore));
            }
        }
        p++;
}



map<string, int>::iterator a = mymap.begin();
while(a != mymap.end())
{
if(playerName == a->first && playerPosition == "goalkeeper")
{
   goalkeepers++;
   goalkeeperBonus+=(a->second*5000);
   sumBonus+=goalkeeperBonus;
}
else if(playerName == a->first && playerPosition == "midfielder")
{
   midfielders++;
   midfielderBonus+=(a->second*2000);
   sumBonus+=midfielderBonus;
}
a++;
}

Данные испытаний:

Score: 3-1 
Ben
Steven
Ben
Score: 2-0 
John
Steven
Score: 1-0 
Ben
Score: 0-0
Score: 1-1 
Cole
Score: 1-2
Ben
Score: 3-0
Cole
Steven
Ben

Я попытался выполнить cout во время цикла while, и я получил вывод:

Ben 5
Cole 2
John 1
Steven 3

Это должен быть правильный результат, когда у Стивена 3 гола. Но я получаю 4, добавил Джон. Есть ли способ назначить бонус a-> first, который является именем игрока?

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

midfielderBonus+=(a->second*2000);

Так что + = означает, что он будет накапливать данные. я предполагаю, что вы забываете midfielderBonus=0 в какой-то момент, когда вы переходите к следующему игроку. Трудно сказать, поскольку фрагмент кода, который вы включили, не показывает инициализацию бонусных переменных.

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

Я не вижу в вашем включенном коде ничего, что могло бы вызвать то, что вы получаете. Конечно, очевидно, что это может объяснить большее, особенно если учесть, что ваш if должен относиться только к одному игроку.

...