我有一个“抽奖”的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速度。我把这个函数称为:
order=speedRaffle(players,pNum);
其中玩家是向量而pNum是int。我做错了什么?
答案 0 :(得分:1)
<强> 1。您正尝试在空向量k
order
的元素
当您拨打order
时,因为向量order[k] = *iter;
为空而崩溃,您应该使用push_back
函数:order.push_back(*iter);
。
<强> 2。你使用循环来移动&#34;迭代器而不是简单的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。您的代码无法执行您需要的操作
&#34;它应该吸引所有玩家&#39;速度和方格。然后,它放了很多(速度的方格)&#34;抽奖券&#34;进入spdtics。然后随机抽取一张票&#34;来自spdtics,并将拥有该票证的玩家的号码按顺序排列。然后,它再次重复,直到所有玩家都被抽出,而不是两次吸引同一个玩家。它返回玩家赢得的顺序。&#34;
根据这个,你的功能应该是这样的:
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()
,则不需要{{1}}个参数。
希望这会对你有所帮助。