我正在leetcode上练习c++:https://leetcode.com/problems/asteroid-collision/description/
我有向量溢出的问题。
terminate called after throwing an instance of 'std::out_of_range'
what(): vector::_M_range_check: __n (which is 1) >= this->size() (which is 1)
class Solution {
public:
vector<int> asteroidCollision(vector<int>& asteroids)
{
auto left = 0;
auto right = asteroids.size() - 1;
while (left <= right) {
if (left == right) {
return asteroids;
}
if ((asteroids.at(left) > 0 && asteroids.at(right) < 0) || (asteroids.at(left) < 0 && asteroids.at(right) > 0)) {
if (abs(asteroids.at(left)) == abs(asteroids.at(right))) {
asteroids.erase(asteroids.begin() + right);
// until this everything seems fine
asteroids.erase(asteroids.begin() + left);
left++;
right--;
}
if (abs(asteroids.at(left)) > abs(asteroids.at(right))) {
asteroids.erase(asteroids.begin() + right);
right--;
}
if (abs(asteroids.at(left)) < abs(asteroids.at(right))) {
asteroids.erase(asteroids.begin() + left);
left++;
}
}
cout << asteroids.size();
}
return asteroids;
}
};
我知道擦除会缩小向量的大小,但我看不出超出范围是如何发生的
编辑:这是我的第一个版本的代码,我知道我可以写得更简单(比如更少的 if 语句或 abs() 等),但首先我想知道代码失败的原因。
您循环获取向量的原始大小,但在循环内减小了向量的大小,因此当访问超出new减小的大小时,最终会访问出界。
如果向量最初包含 10 个元素,您将循环 10 次并访问元素 0-9。如果你删除 1 个元素,那么唯一有效的索引将为 0-8,所以一旦你达到索引 9,你就出界了。