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
相关产品推荐
相关产品推荐

