C++代码在台式机上工作正常,但在笔记本电脑上则不行
C++ code works fine on desktop but not on the laptop
由于某种原因,这个简单的代码在我的桌面上运行得很好,但是当我在笔记本电脑上尝试它时,只有第一部分(打印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
,该值引用已擦除元素的后继元素的新重新分配位置。
相关文章:
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- Opencv:相同的捕获代码在高端笔记本电脑上提供低 FPS,在 TX1 上提供高 FPS
- RAWINPUTHEADER h笔记本电脑触控板WM_INPUT上的设备空
- QT-如何在我的笔记本电脑上全屏显示Qlabel
- C++ Direct2D - 从笔记本电脑移动正弦文件后出现链接器错误 2019
- 双缓冲在笔记本电脑上不起作用,在台式机上起作用
- 如何区分外接显示器和笔记本电脑屏幕本身?
- 在笔记本电脑上开发不支持 GPU 的 OpenCL 应用程序
- 检测笔记本电脑上的电源按钮按下
- 在笔记本电脑上设置WindowPos和放大对话框
- 我的 265GB RAM 笔记本电脑上的内存是否超过 8GB
- 无法使用 OpenCV 打开我的笔记本电脑相机
- 在Optimus笔记本电脑中以编程方式强制NVIDIA GPU
- OpenGL对象在PC上以正常速度旋转,但在笔记本电脑上非常快
- 获取当前笔记本电脑盖状态
- 使用QT过程,使用命令行从笔记本电脑获取传感器信息
- 如何在谷歌地图地理位置API中获取笔记本电脑(wifi)的纬度和经度
- 在没有Alt代码的笔记本电脑上创建Alt代码
- 在Mac上使用c++,如何检查机器是笔记本电脑还是台式机
- 蓝牙4 (BLE)似乎无法在许多设备上访问(例如HP 15-d004au笔记本电脑)