我有一个“抽奖”C++ 程序,用于“抽出帽子”。不过,当我尝试使用它时,我会收到一个 EXC_BAD_ACCESS 信号。这是函数:
vector<int> speedRaffle(vector<Player>players,int pNum){
vector<int> spdtics,order;
int ticnum,randy;
vector<int>::iterator iter = spdtics.begin();
for (int k=0;k<pNum;k++){
for (int i=0; i<pNum; i++) {
for (int j=0; j<pow(players[i].speed,2); j++){
for (int io=0; io<order.size(); io++) {
if(order[io]!=i){
spdtics.push_back(i);
ticnum++;
}
}
}
}
randy=random() % ticnum;
for(int i=0;i<randy;i++){
iter++;
}
order[k]=*iter; //Thread 1: Program received signal: "EXC_BAD_ACCESS".
iter=spdtics.begin();
}
return order;
}
此函数应获取所有玩家的速度并将其平方。然后,它将那么多(速度的平方)“抽奖券”放入 spdtics。然后它从 spdtics 随机抽取一张“票”,并将拥有该票的玩家的号码排序。然后,它再次重复,直到所有玩家都被抽到,而不是两次抽到同一个玩家。它返回玩家获胜的顺序。
类 Player 包含一个 int speed。我这样称呼这个函数:
order=speedRaffle(players,pNum);
其中玩家是 vector ,pNum 是整数。我做错了什么?
最佳答案
<强>1。您正在尝试访问索引 k
处的元素在空 vector 中 order
它崩溃是因为 vector 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。 vector中的元素可以通过索引直接访问
在这种情况下,您根本不需要任何迭代器。
<强>5。按值传递 vector 而不是按引用传递 vector
vector<int> speedRaffle(vector<Player>players,int pNum)
请注意, vector 的拷贝 players
每次调用此函数时都会创建。你不想那样做。您也不想在函数内部更改此 vector ,因此将此参数声明为 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()
则为参数.
希望对您有所帮助。
关于c++ - 抽奖分类程序上的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9249582/