为什么在迭代时从矢量中擦除元素会导致分段错误(核心转储)



下面生成了我在大型程序中遇到的问题。

#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;
}

这导致CCD_ 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 >= 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循环在第一个程序中所做的吗?我只是把向量开始的条件移到了循环之外!

同样,在这样迭代的同时,从向量中删除元素的正确方法是什么?

正如注释所说,iunsigned,因此i >= 0始终为真。当i小于0时,它实际上变成了一个大的正数,然后用i索引到向量中会调用未定义的行为。

从向量中擦除元素的正确方法是使用擦除移除if习惯用法:

vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) {
return i > 2; }), vec.end());

相关内容

  • 没有找到相关文章

最新更新