You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

关键修改点

  1. vec.push_back(0):将vector大小从8扩展到9,预留新元素的存储空间,原元素位置全部保留。
  2. 初始i值改为vec.size()-2:扩容后原末尾元素的索引不再是size-1,需调整索引指向正确位置。
  3. 循环条件增加i >= 0:避免新元素小于所有元素时,i变为-1导致访问vec[-1]的越界问题。

执行修正后的代码,输出为4 8 13 16 18 20 25 28 33,末尾元素33得以保留。

内容的提问来源于stack exchange,提问作者Soumyadeep Chatterjee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:52:16