C++代码在台式机上工作正常,但在笔记本电脑上则不行

C++ code works fine on desktop but not on the laptop

本文关键字:笔记本 电脑 台式机 代码 工作 C++      更新时间:2023-10-16

由于某种原因,这个简单的代码在我的桌面上运行得很好,但是当我在笔记本电脑上尝试它时,只有第一部分(打印vector的元素(工作,然后程序结束,而不是说"进程完成,退出代码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;
}

问题不在于计算机,而在于代码。

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

发生这种情况是因为迭代器失效,当您擦除向量的元素时,迭代器it失效导致未定义的行为,您可以在此处阅读有关此内容的更多信息 迭代器失效规则

你的程序有未定义的行为,你递减一个无效的迭代器

array.erase(it); // it becomes invalid
it--; // Undefined

您可以通过删除具有"擦除-删除"模式的元素来避免这种情况

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,该值引用已擦除元素的后继元素的新重新分配位置。