以下是我在一个大型程序中产生的问题。
#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循环的作用吗?我只是把向量开始的条件移到了循环之外!我的程序中,不就是把向量开始的条件移到了循环之外吗?
另外,在这样迭代的时候,从向量中擦除元素的正确方法是什么?
正如评论所说。i
是 unsigned
因此 i >= 0
永远是真的。当 i
变得小于 0
它实际上变成了一个大的正数,然后在向量中用 i
调用未定义的行为。
的 妥当 从向量中删除元素的方法是使用 擦除-删除-如果 习惯用语
vec.erase(std::remove_if(vec.begin(), vec.end(), [](int i) {
return i > 2; }), vec.end());