1.Вы пытаетесь получить доступ к элементу по индексу k
в пустом векторе order
Он падает, потому что вектор order
пуст при вызове order[k] = *iter;
, вместо этого следует использовать функцию push_back
: order.push_back(*iter);
.
2.Вы используете цикл для «перемещения» итератора вместо простого advance
вызова
advance(iter, randy - 1);
, который имеет тот же эффект, что и этот цикл: for(int i=0;i<randy;i++){ iter++; }
.
3.Вы вызываете pow
в каждой отдельной итерации
for (int j=0; j<pow(players[i].speed,2); j++)
Обратите внимание, что это будет намного быстрее:
int maxspeed = pow(players[i].speed,2);
for (int j = 0; j < maxspeed; j++)
4.Доступ к элементам в векторе можно получить напрямую с помощью индекса
. В этом случае вам вообще не нужен итератор.
5.Передача вектора по значению вместо передачи по ссылке
vector<int> speedRaffle(vector<Player>players,int pNum)
Обратите внимание, что копия вектора players
создается каждый раз, когда вы вызываете эту функцию.Вы не хотите этого делать.Вы также не хотите изменять этот вектор внутри функции, поэтому объявление этого аргумента как const
было бы намного лучше:
vector<int> speedRaffle(const vector<Player>& players, int pNum)
6.Ваш код не делает то, что вам нужно, чтобы сделать
«Он должен взять все скорости игроков и возвести их в квадрат. Затем он складывает это количество (квадраты скоростей)»разыгрывать билеты "в spdtics". Затем он случайным образом вытягивает один "билет" из spdtics и помещает номер игрока, которому принадлежал билет, в порядок. Затем он повторяется до тех пор, пока все игроки не будут разыграны, не вытягивая одного игрока дважды.Он возвращает порядок, в котором игроки выиграли. "
В соответствии с этим ваша функция должна выглядеть следующим образом:
vector<int> speedRaffle(vector<Player>& players)
{
// create vector of tickets:
set<int> ticketOwners;
vector<int> spdtics;
for (int i = 0; i < players.size(); i++)
{
ticketOwners.insert(i);
int maxspeed = pow(players[i].speed,2);
for (int j = 0; j < maxspeed; j++)
{
spdtics.push_back(i);
}
}
// draw ticket for every player:
vector<int> order;
while (!ticketOwners.empty())
{
set<int>::const_iterator to;
int randy;
do
{
randy = random() % spdtics.size();
to = ticketOwners.find(spdtics[randy]);
}
while (to == ticketOwners.end());
spdtics.erase(spdtics.begin() + randy);
order.push_back(*to);
ticketOwners.erase(to);
}
return order;
}
Также обратите внимание, что вам не нужно pNum
аргумент, если он равен players.size()
.
Надеюсь, это поможет вам.