首页 > 解决方案 > 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 )

标签: c++vector

解决方案


你的第二个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  << " ";
}

推荐阅读