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

