gpt4 book ai didi

c++ - vector 越界

转载 作者:太空宇宙 更新时间:2023-11-04 15:30:47 26 4
gpt4 key购买 nike

我正在尝试遍历 6 个“国际象棋”棋子的列表。每轮他们移动一个随机数量,如果他们落在另一个上,他们就会“杀死”它。

问题是,当我的 vector 中的最后一 block 杀死另一 block 时,我收到 vector “超出范围”错误。我猜这是因为我在遍历一个 vector 的同时也从中删除了项目,但是当我删除一 block 时我并没有增加计数所以我不完全确定。任何帮助将不胜感激。

这是我的 vector :

vector<Piece*> pieces;
pieces.push_back(&b);
pieces.push_back(&r);
pieces.push_back(&q);
pieces.push_back(&b2);
pieces.push_back(&r2);
pieces.push_back(&q2);

这是我使用的循环:

while (pieces.size() > 1) {
cout << "-------------- Round " << round << " --------------" << endl;
round++;
cout << pieces.size() << " pieces left" << endl;
i = 0;
while (i < pieces.size()) {
pieces.at(i)->move(board.getMaxLength());
j = 0;
while (j < pieces.size()) {
if (pieces.at(i) != pieces.at(j) && col.detectCollision(pieces.at(i), pieces.at(j))) {
cout << pieces.at(i)->getName() << " has slain " << pieces.at(j)->getName() << endl << endl;
pieces.at(i)->setKills(pieces.at(i)->getKills() + 1);
pieces.erase(pieces.begin() + j);
}
else {
j++;
}
}
i++;
}
}

解决方案

pieces.erase(pieces.begin() + j);
break;

最佳答案

您的逻辑需要一点改进。

按照您的编码方式,国际象棋的“回合制”性质似乎已被一种“优先级列表”所取代——靠近 vector 起点的棋子被允许首先移动,因此,优先粉碎其他棋子。

不知道你希望这个逻辑对还是错。无论如何,问题似乎是由于无条件执行该行

i++;

如果您出于与未执行“j++”相同的原因删除一 block ,则不应执行:您将跳过一 block 。

关于c++ - vector 越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com