C++向量迭代器:erase() 最后一个项目崩溃
C++ vector iterator: erase() last item crash
下面的代码检查球是否与砖重叠。如果发生重叠,砖块将突出显示并从列表中擦除。
仅擦除矢量砖墙中的最后一项时,我遇到了核心转储。注释 erase() 行,代码似乎运行良好。
在浏览了论坛上的类似问题后,我相信我正在正确迭代和擦除矢量中的项目,但我怀疑情况可能并非如此。
对此代码的任何建议将不胜感激!
void Game::updateEntities()
{
ballMother.update();
for (std::vector<gdf::Entity>::iterator it = brickWall.begin(); it != brickWall.end(); ++it)
{
if (it->getRect().intersects(ballMother.getRect())) {
it->rect.setFillColor(sf::Color::Red);
it = brickWall.erase(it);
}
else {
it->rect.setFillColor(it->colour);
}
}
}
通常的成语是
for (std::vector<gdf::Entity>::iterator it = brickWall.begin(); it != brickWall.end(); /*note nothing here*/)
{
if (it->getRect().intersects(ballMother.getRect())) {
it->rect.setFillColor(sf::Color::Red);
it = brickWall.erase(it);
}
else {
it->rect.setFillColor(it->colour);
++it;
}
}
否则,您将跳过元素,并最终因超过终点而崩溃。
K-ballo 发现了这个错误,并提出了一个很好的成语,但你可能会发现使用标准算法和擦除删除成语更容易。
struct Pred {
Pred(const BallMother& ballMother) {
//save refs to whatever you need for the compare
}
bool operator()(const gdf::Entity& item) {
//collision logic here, return true if you want it erased
}
};
现在在您的函数中:
std::vector<gdf::Entity>::iterator end_iter =
std::remove_if(brickWall.begin(), brickWall.end(), Pred(ballMother));
brickWall.erase(end_iter, brickWall.end());
或者更简洁地说:
brickWall.erase(std::remove_if(brickWall.begin(), brickWall.end(), Pred(ballMother)),
brickWall.end());
相关文章:
- 运行同一解决方案的另一个项目的项目
- 从链接列表c++中删除一个项目
- lower_bound()返回最后一个元素
- 获取向量C++中第一个值和最后一个值的和
- 获取用C/C++打印的最后一个字符串
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 为什么这个程序返回最后一个单词而不是最长的单词?
- 为什么我的最后一个 ELSE 条件无法正确执行
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 仅显示链表的最后一个元素
- 测试迭代器是否位于列表中的最后一个
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- std::矢量保存 只推送最后一个元素
- 数组中无法解释的最后一个项目
- 检查最后一个项目是否通过地图密钥存在
- C++向量迭代器:erase() 最后一个项目崩溃
- 将空格字符添加到附加的每个项目,以必须擦除最后一个项目.如何改进