c++ - C++向量擦除函数说明
问题描述
我正在运行以下代码:
v1.assign(10,50);
v1.insert(v1.end(),22);
cout << "v1 > " << endl;
print(v1);
// prints 50 50 50 50 50 50 50 50 50 50 22
v1.erase(v1.begin()+2)v1.assign(10,50);
v1.insert(v1.end(),22);
cout << "v1 > " << endl;
print<int>(v1);
v1.erase(v1.begin()+2);
for (int i=0;i<11;i++)
cout << v1[i] << " ";
cout << endl << endl;;
for (int i=0;i<11;i++)
cout << v1[i] << " ";
cout << endl << endl;
据我说,预期的输出必须是:
50 50 50 50 50 50 50 50 50 22
(9次50,1次22)
但实际上是:
50 50 50 50 50 50 50 50 50 22 22
( 9 次 50 )
解决方案
你的第二个v1.assign(10,50);
基本上重置向量给出 10 乘以 50 然后你附加一个 22 给出一个长度为 11 的向量然后你擦除 1 个元素给出一个长度为 10 的向量
因此你的循环:
for (int i=0;i<11;i++)
cout << v1[i] << " ";
越界访问向量,为您提供位于向量旁边的内存中的任何值。
像这样循环一个向量以防止此类错误:
for (const auto& element : v1)
{
cout << element << " ";
}
推荐阅读
- php - Laravel API Session 数据从不同的客户端返回不同的值
- jquery - jquery循环点击功能有错误的结果
- excel - 如何调用包含循环但只运行该循环的一次迭代的宏?
- annotations - Allure2 和 Selenide - @Step 注释未显示在报告中
- python - 替换数据框列中的特定值
- android - 处理程序中的Android内存泄漏
- java - 打开一个无效的数据库连接
- java - Jackson JsonSchema - 对象作为模式中的字符串
- aws-lambda - Aws - 长时间运行作业的最佳实践
- security - 如何更新 package-lock.json 中的依赖项