C++ vector插入元素后输出缺失末尾元素,求助排查解决
问题:向有序vector插入元素后丢失末尾元素
我编写了一段向有序vector中插入元素的C++代码,执行后元素成功插入,但原vector的末尾元素33丢失,实际输出为4 8 13 16 18 20 25 28。代码如下:
#include <iostream> #include <vector> using namespace std; void insert(vector<int> &vec, int newEle) { int i = vec.size() - 1; while (vec[i] > newEle) { cout << vec[i] << endl; vec[i + 1] = vec[i]; i--; } vec[i + 1] = newEle; } void display(vector<int> &vec) { for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } } int main() { vector<int> vect{4, 8, 13, 16, 20, 25, 28, 33}; insert(vect, 18); display(vect); // cout << endl; // insert(vect, 11); // display(vect); return 0; }
问题原因
代码未对vector做扩容操作:初始vector大小为8,最大索引是7,移动元素时访问vec[i+1]会越界(属于未定义行为)。且vector最终大小仍为8,插入新元素时会覆盖原末尾元素的存储空间,导致33丢失。
解决方法
插入元素前先给vector扩容,确保有足够空间容纳新元素。同时完善循环条件,避免索引越界。
修正后的代码:
#include <iostream> #include <vector> using namespace std; void insert(vector<int> &vec, int newEle) { // 先扩容,添加占位元素 vec.push_back(0); // 原最后一个元素的索引变为size-2 int i = vec.size() - 2; // 增加i>=0判断,防止新元素比所有元素都小时越界 while (i >= 0 && vec[i] > newEle) { cout << vec[i] << endl; vec[i + 1] = vec[i]; i--; } vec[i + 1] = newEle; } void display(vector<int> &vec) { for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } } int main() { vector<int> vect{4, 8, 13, 16, 20, 25, 28, 33}; insert(vect, 18); display(vect); // cout << endl; // insert(vect, 11); // display(vect); return 0; }
关键修改点
vec.push_back(0):将vector大小从8扩展到9,预留新元素的存储空间,原元素位置全部保留。- 初始i值改为
vec.size()-2:扩容后原末尾元素的索引不再是size-1,需调整索引指向正确位置。 - 循环条件增加
i >= 0:避免新元素小于所有元素时,i变为-1导致访问vec[-1]的越界问题。
执行修正后的代码,输出为4 8 13 16 18 20 25 28 33,末尾元素33得以保留。
内容的提问来源于stack exchange,提问作者Soumyadeep Chatterjee
相关产品推荐
相关产品推荐

