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

C++中vector自我拼接运行异常,求错误原因及解决方法

代码错误原因

  • 核心问题是vector动态扩容触发迭代器失效:
    你在遍历前获取了nums.begin()迭代器,后续调用push_back向vector插入元素时,若当前vector的预留容量不足以容纳新增元素,vector会自动申请更大的连续内存,将原有元素拷贝到新内存后释放旧内存。此时你之前保存的迭代器就变成了指向已释放内存的野指针,后续*itr解引用、itr++偏移都是未定义行为,因此会输出随机值。

正确实现参考

方案1:提前预留容量避免扩容

提前申请两倍原长度的容量,插入过程中不会触发扩容,迭代器保持有效:

vector<int> getConcatenation(vector<int>& nums) {
    int size = nums.size();
    nums.reserve(size * 2);
    auto itr = nums.begin();
    while(size--) {
        nums.push_back(*itr);
        itr++;
    }
    return nums;      
}

方案2:用下标访问替代迭代器(更稳妥)

下标基于元素偏移量计算,即使vector扩容,只要访问原长度范围内的下标都不会出错:

vector<int> getConcatenation(vector<int>& nums) {
    int size = nums.size();
    for(int i = 0; i < size; i++) {
        nums.push_back(nums[i]);
    }
    return nums;      
}

方案3:标准库API极简实现

直接调用insert接口批量插入原有区间的元素:

vector<int> getConcatenation(vector<int>& nums) {
    nums.insert(nums.end(), nums.begin(), nums.end());
    return nums;
}

内容的提问来源于stack exchange,提问作者Surbhi Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:45:04