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

C++中vector insert迭代器插入末尾元素至开头的异常问题

问题分析与解决

你遇到的问题是因为直接使用vector自身的迭代器范围进行插入操作时,触发了迭代器失效的未定义行为。

为什么会出错?

当执行nums.insert(nums.begin(), nums.end()-k, nums.end())时:

  • 如果插入位置(nums.begin())在你要拷贝的元素范围(nums.end()-k到nums.end())的前面,insert操作会先将原有元素向后移动以腾出插入空间。这个移动过程会导致原vector的迭代器失效——原本指向末尾元素的迭代器,现在可能指向了被移动后的错误位置。
  • 比如nums=[1,2,3]且k=1时,插入操作启动后,原元素会被向后移动,此时nums.end()-1这个迭代器已经不再指向原来的3,而是指向了移动后的2,所以最终插入的是2而非预期的3。

修复方案

先将要插入的末尾元素拷贝到临时容器中,再将临时容器的元素插入到原vector开头,避免迭代器失效问题:

// 先保存需要插入的末尾k个元素
vector<int> temp(nums.end() - k, nums.end());
// 插入到vector开头
nums.insert(nums.begin(), temp.begin(), temp.end());

验证结果

  • 当nums=[1,2,3]且k=1时,temp为[3],插入后nums变为[3,1,2,3],符合预期。
  • 当nums=[1,2,3,4]且k=1时,temp为[4],插入后nums变为[4,1,2,3,4],和之前正确结果一致。
  • 当nums=[1,2,3]且k=2时,temp为[2,3],插入后nums变为[2,3,1,2,3],结果正确。

内容的提问来源于stack exchange,提问作者Iffat Hossain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:52:47