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

C++中vector调用reserve后无法用[]赋值,为何触发越界异常?

问题原因及解决方案

核心误区:混淆vector的size和capacity

C++的vector有两个关键属性:

  • size:当前实际存储的元素数量,有效索引范围是0 ~ size-1
  • capacity:当前预留内存能容纳的最大元素数量,reserve()只会修改这个值,不会改变size,也不会构造任何元素

代码1的问题

vector<int> test;
test.reserve(100);
test[36] = -234;

reserve(100)只是给vector预留了能装100个元素的内存,但此时test.size()还是0——没有任何实际元素。operator[]访问索引36时,超出了size的范围(有效索引不存在),自然触发越界异常。

代码2的问题

vector<int> test;
test.reserve(100);
test = {1};
test[1] = -234;

test = {1}会把vector的元素替换成一个int值1,此时test.size()变为1,有效索引只有0。访问索引1同样超出了size范围,和之前reserve的内存无关——预留的内存只是让后续扩容更高效,但不会改变当前元素数量。


正确的写法

如果需要直接访问指定索引的元素,得先让size覆盖目标索引:

  1. 使用resize()直接设置size(会默认初始化元素):
vector<int> test;
test.resize(100); // size变为100,元素默认初始化为0
test[36] = -234;
  1. 若不想初始化所有元素,可通过push_back/emplace_back添加元素到目标数量,或用insert构造指定位置的元素:
vector<int> test;
test.reserve(100); // 先预留内存避免扩容
for (int i = 0; i < 37; ++i) {
    test.emplace_back(0); // 添加到size=37
}
test[36] = -234;
  1. 想要安全的边界检查,用at()方法替代operator[],但它同样要求索引在0 ~ size-1范围内:
vector<int> test;
test.resize(100);
test.at(36) = -234; // 索引合法时正常赋值,越界会抛出std::out_of_range

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:25:22