std::out_of_range错误修复求助:vector越界访问问题
解决
std::out_of_range vector越界错误 这个错误我太熟悉了!你看到的vector::_M_range_check: __n (值为0) >= this->size() (值为0),本质就是你在尝试访问一个空vector的索引0——当你的vPos或vNeg还没有任何元素(size为0)时,你直接用vPos[0]或者vNeg[0]去访问对应的子vector,自然触发了vector的越界检查机制。
结合你说的“基于vector of vectors实现键值对算法”的场景,我帮你拆解问题和解决办法:
核心问题根源
你的逻辑里默认“键对应vector的索引”,但vector的operator[]不会自动扩容——当键对应的索引大于等于当前vector的size时,直接访问就会报错。比如:
- 当你第一次处理正键0时,
vPos还是空的(size=0),vPos[0]就会触发这个错误; - 如果处理负键-1,你可能直接映射到
vNeg[0],但此时vNeg也是空的,同样越界。
具体解决步骤
1. 添加值前先检查并扩容vector
在向对应键的子vector添加元素前,先确保外层vector的size足够容纳该索引,不够就用resize扩容(扩容时会自动填充空的子vector):
// 处理正键:k为非负整数 void addValueToPositiveKey(int k, int value) { // 如果当前vPos的大小小于等于k,扩容到k+1(因为索引从0开始) if (k >= vPos.size()) { vPos.resize(k + 1); } // 现在vPos[k]是有效的空vector,可以安全添加值 vPos[k].push_back(value); } // 处理负键:k为负整数,先转成非负索引(比如-1→0,-2→1...) void addValueToNegativeKey(int k, int value) { int idx = -k - 1; // 把负键转成从0开始的索引 if (idx >= vNeg.size()) { vNeg.resize(idx + 1); } vNeg[idx].push_back(value); }
2. 修复size函数的实现
你的size函数如果直接访问对应索引的子vector的size,同样要先检查索引是否有效,否则会重复触发错误:
// 获取正键对应序列的长度 int getPositiveSequenceSize(int k) { if (k >= vPos.size()) { return 0; // 键不存在,序列长度为0 } return vPos[k].size(); } // 获取负键对应序列的长度 int getNegativeSequenceSize(int k) { int idx = -k - 1; if (idx >= vNeg.size()) { return 0; } return vNeg[idx].size(); }
3. 避免直接用operator[]访问未知索引
记住:vector的operator[]只负责访问已存在的元素,不会自动创建元素。如果不确定索引是否有效,优先用at()方法(会抛出明确的越界异常),或者先做size检查——不过我们上面的扩容逻辑已经从根源避免了这个问题。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

