【发布时间】:2018-12-07 17:28:31
【问题描述】:
我正在尝试遍历包含 6 个“国际象棋”棋子的列表。每一轮他们移动一个随机数量,如果他们降落在另一轮上,他们就会“杀死”它。
问题是当我的向量中的最后一个片段杀死另一个片段时,我得到一个向量“超出范围”错误。我猜这是因为我在遍历向量的同时还从中删除了项目,但是当我擦除一块时我并没有增加计数,所以我不完全确定。任何帮助将不胜感激。
这是我的向量:
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;
【问题讨论】:
-
这就是调试器的用途。使用您的调试器,观察
i和j的值,以及向量的大小如何变化,原因以及错误应该很明显。了解如何使用调试器是每个 C++ 开发人员必备的技能。没有例外。附:您甚至可能在关键的at()爆炸之前看到该错误。观察一下,就像魔术一样,在外循环的下一次迭代中,pieces.at(i)与循环的上一次迭代不同,并问自己:这是怎么发生的? -
检查 this 以便在迭代向量时安全地从向量中删除项目
-
你在设计这个程序时没有考虑到某个位置是什么?如果是这样,您为什么需要搜索需要“杀死”的部分?换句话说,为什么需要第二个
while循环? -
@PaulMcKenzie 检查我认为的所有配对
-
整个碰撞逻辑非常混乱。是什么让
j项目被删除,而不是i项目?为什么i项比j“更强”?我认为这就是麻烦开始的地方,而且没有一套连贯的规则。