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

