循环遍历向量 std::out_of_range'

问题描述 投票:0回答:1

我正在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() 等),但首先我想知道代码失败的原因。

c++ vector overflow erase
1个回答
1
投票

您循环获取向量的原始大小,但在循环内减小了向量的大小,因此当访问超出new减小的大小时,最终会访问出界。

如果向量最初包含 10 个元素,您将循环 10 次并访问元素 0-9。如果你删除 1 个元素,那么唯一有效的索引将为 0-8,所以一旦你达到索引 9,你就出界了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.