为什么在迭代时擦除向量中的元素会导致Segmentation故障(core dumped)?

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

以下是我在一个大型程序中产生的问题。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{1, 2, 3, 4, 5};

    for (unsigned i = vec.size() - 1; i >= 0; --i) {
        if (vec[i] > 2) vec.erase(vec.begin() + i);
        else cout << vec[i] << "  ";
    }
    cout << endl;


    return 0;
}

这将导致 Segmentation fault (core dumped).

经过一番调试,我发现修改下面的代码,"解决 "了这个问题。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec{1, 2, 3, 4, 5};

    for (unsigned i = vec.size() - 1; i >= 1; --i) {
        if (vec[i] > 2) vec.erase(vec.begin() + i);
        else cout << vec[i] << "  ";
    }
    if (vec[0] > 2) vec.erase(vec.begin());
    else cout << vec[0] << "  ";
    cout << endl;


    return 0;
}

这是在打印我期望得到的结果。

2 1

这不就是第一个程序中for循环的作用吗?我只是把向量开始的条件移到了循环之外!我的程序中,不就是把向量开始的条件移到了循环之外吗?

另外,在这样迭代的时候,从向量中擦除元素的正确方法是什么?

c++ vector segmentation-fault iteration erase
1个回答
0
投票

正如评论所说。iunsigned因此 i >= 0 永远是真的。当 i 变得小于 0 它实际上变成了一个大的正数,然后在向量中用 i 调用未定义的行为。

妥当 从向量中删除元素的方法是使用 擦除-删除-如果 习惯用语

vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) {
            return i > 2; }), vec.end());
© www.soinside.com 2019 - 2024. All rights reserved.