![](/img/trans.png)
[英]C++ code involving vector works fine on visual studio and not on linux
[英]C++ code works fine on desktop but not on the laptop
出于某种原因,这个简单的代码在我的桌面上运行得非常好,但是当我在我的笔记本电脑上尝试它时,只有第一部分(打印向量的元素)可以工作,然后程序结束,而不是说“进程完成,退出代码 0”它说
“进程以退出代码 -1073741819 (0xC0000005) 结束”。 我不知道我的笔记本电脑出了什么问题。 谁能帮我?
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> array{1, 2, 3, 4, 5};
vector<int>::iterator it;
int arraysize;
for (int i = 0; i < array.size(); i++) {
cout << array[i] << endl;
}
cout << " " << endl;
for (it = array.begin(); it < array.end(); it++) {
if(*it%2==0){
array.erase(it);
it--;
}
}
arraysize=array.size();
cout<<"size:"<<arraysize<<endl;
for (int i = 0; i < array.size(); i++) {
cout << array[i] << endl;
}
return 0;
}
发生这种情况是因为迭代器失效,当您擦除向量的一个元素时,迭代器it
失效导致未定义的行为,您可以在此处阅读更多有关此迭代器失效规则的信息
问题不在于计算机,而在于代码。
array.erase(it);
使迭代器it
无效,并且任何后续使用它都有未定义的行为。
最糟糕的一种未定义行为是看起来有效的行为。
erase
将一个迭代器返回到擦除后的元素,您应该使用它。
for (it = array.begin(); it < array.end(); it++) {
if(*it%2==0){
it = array.erase(it);
it--;
}
}
或者
it = array.begin();
while (it < array.end()) {
if(*it%2==0){
it = array.erase(it);
}
else {
it++;
}
}
你的程序有未定义的行为,你减少了一个无效的迭代器
array.erase(it); // it becomes invalid
it--; // Undefined
您可以通过使用“erase-remove”模式删除元素来避免这种情况
auto is_even = [](int i) { return i%2==0; };
array.erase(std::remove_if(array.begin(), array.end(), is_even), array.end());
或者在 C++20 中
std::erase_if(array, is_even);
你的笔记本电脑没有问题。 问题出在代码上。 当您从向量中擦除某些内容时,它会使擦除元素之后的先前存在的迭代器无效。 您可能希望使用erase
的返回值,它引用已擦除元素的后继元素的新重新分配位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.