Vector使用中的错误总结

Vector使用中的错误总结 一、遍历的同时erase后面的元素向前移动导致下标错误//删除v中所有的偶数for(inti0;iv.size();i){if(v[i]%20)v.erase(v.begin()i);//这里删除了数组的第i位于是第i1位至末尾的每一位都会向前移动一步补位//然而按数组遍历的要求下一次访问的位置是i于是可以发现原第i1位被错误的跳过了}可以使用erase-remove来正确删除或者直接倒序遍历删除二、reserve vs resize函数功能元素个数 size()空间 capacity()resize(n)改变 vector 的元素个数为 nn≥ nreserve(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()保证非空五、二维vectorvectorvectorinta(3,vectorint(2,7));//vectorint(2, 7)的意思是长度为2元素都是7的vector//vectorvectorint a(3, ...));的意思是构建3个这样的vector/* 所以结果是 a [ {7,7}, {7,7}, {7,7} ] */六、vector定义vectorintv(N);//创建一个长N的int类型vector v,并且每个值都赋为0不需要额外赋值七、只读访问避免每次访问时都需复制vector中元素for(constautox:v){// 只读访问取地址不用复制const表示不可修改}