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覆盖目标索引:
- 使用
resize()直接设置size(会默认初始化元素):
vector<int> test; test.resize(100); // size变为100,元素默认初始化为0 test[36] = -234;
- 若不想初始化所有元素,可通过
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;
- 想要安全的边界检查,用
at()方法替代operator[],但它同样要求索引在0 ~ size-1范围内:
vector<int> test; test.resize(100); test.at(36) = -234; // 索引合法时正常赋值,越界会抛出std::out_of_range
内容的提问来源于stack exchange,提问作者Firegreat
相关产品推荐
相关产品推荐

