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

C++代码报错:cannot seek vector iterator after end 问题排查求助

排查vector反向迭代器越界错误及修正方案

原代码试图将vector第3到第7位(1-based)的元素反向复制到list,但在初始化反向迭代器时触发越界错误,错误信息为Expression:cannot seek vector iterator after end。

核心错误点

  • 反向迭代器算术操作逻辑完全错误:
    反向迭代器的移动方向与正向迭代器相反:
    • crbegin()指向vector最后一个元素(索引9,值55),crbegin() - 2会尝试移动到正向索引9+2=11的位置,而vector仅包含10个元素(索引0-9),直接超出容器范围触发越界。
    • ivec.crend() +3同理,crend()指向vector第一个元素的前一个位置(正向begin()之前),加3会尝试移动到**正向begin()-3**的位置,同样属于越界操作。
  • 冗余的back_inserter创建:循环内每次新建back_inserter(ilst),虽不影响功能,但完全没必要,应将其定义在循环外。

修正方案

方案一:使用reverse_copy标准算法(推荐)

利用标准库算法直接处理,代码简洁易读,无需手动操作迭代器:

#include <vector>
#include <iterator>
#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

int main()
{
    list<int> ilst;
    vector<int> ivec{1,1,2,3,5,8,13,21,34,55};
    
    // 第3到第7位(1-based)对应正向索引2到6,左闭右开区间所以end取索引7
    reverse_copy(ivec.begin() + 2, ivec.begin() + 7, back_inserter(ilst));
    
    // 验证输出(可选)
    for (int num : ilst) {
        cout << num << " ";
    }
    // 输出:13 8 5 3 2
    return 0;
}

方案二:正确使用反向迭代器

如果要手动操作反向迭代器,需明确反向迭代器对应的正向范围:
要复制的正向范围是[ivec.begin()+2, ivec.begin()+7),对应的反向迭代器范围为[ivec.crbegin() + 3, ivec.crbegin() + 8)(反向迭代器crbegin()对应正向end()-1,正向索引6对应crbegin()+3,正向索引2的前一个位置对应crbegin()+8)。

#include <vector>
#include <iterator>
#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

int main()
{
    list<int> ilst;
    vector<int> ivec{1,1,2,3,5,8,13,21,34,55};
    
    auto start = ivec.crbegin() + 3; // 对应正向索引6(值13)
    auto end = ivec.crbegin() + 8;   // 对应反向遍历的终止位置
    auto inserter = back_inserter(ilst);
    
    for (; start != end; ++start) { // 反向迭代器用++实现向左遍历
        *inserter = *start;
    }
    
    // 验证输出(可选)
    for (int num : ilst) {
        cout << num << " ";
    }
    // 输出:13 8 5 3 2
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:22:47