Vector使用中的错误总结
2026/6/13 20:28:04 网站建设 项目流程

一、遍历的同时erase,后面的元素向前移动,导致下标错误

//删除v中所有的偶数for(inti=0;i<v.size();i++){if(v[i]%2==0)v.erase(v.begin()+i);//这里删除了数组的第i位,于是第i+1位至末尾的每一位都会向前移动一步补位//然而按数组遍历的要求下一次访问的位置是i++,于是可以发现原第i+1位被错误的跳过了}

可以使用erase-remove来正确删除,或者直接倒序遍历删除

二、reserve vs resize

函数功能元素个数 size()空间 capacity()
resize(n)改变 vector 的元素个数为 nn≥ n
reserve(n)预分配空间,不增加元素个数不变≥ n

也就是说v.reserve(100);后,v.capacity()会变为100,但v.size()相较之前不会发生任何改变,如果v是空的,此时访问v[0]将会越界。

capacity是在不分配新的内存空间的前提下,容器最多可以存储的元素数量。

size 是指容器中当前存储的元素的数量。

三、vector push_back 后不要继续用之前保存的迭代器

因为vector内部是连续内存数组,push_back 可能触发扩容,扩容后原来的内存被释放,it就会失效,再访问 *it 是未定义行为(UB)。

四、pop_back()和back()之类的操作前先用!empty()保证非空

五、二维vector

vector<vector<int>>a(3,vector<int>(2,7));//vector<int>(2, 7)的意思是长度为2,元素都是7的vector//vector<vector<int>> a(3, ...));的意思是构建3个这样的vector/* 所以结果是 a = [ {7,7}, {7,7}, {7,7} ] */

六、vector定义

vector<int>v(N);//创建一个长N的int类型vector v,并且每个值都赋为0,不需要额外赋值

七、只读访问,避免每次访问时都需复制vector中元素

for(constauto&x:v){// 只读访问,&取地址不用复制,const表示不可修改}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询