resize() 和 reserve()
关键区别
| 方法 | 容量变化 | 大小变化 | 元素初始化 | 数据可访问性 |
|---|---|---|---|---|
resize(n) |
可能增加 | 设置为n | 新元素被值初始化 | 可立即访问[0,n) |
reserve(n) |
增加到至少n | 不变 | 不初始化新元素 | 仅可访问原大小范围内的元素 |
详细解释
-
resize(n):- 将 vector 的 size (实际元素数量) 改为
n - 如果
n大于当前 size,会添加新元素并值初始化它们 - 你可以立即访问这些新元素(如
cosTable[0]到cosTable[n-1])
- 将 vector 的 size (实际元素数量) 改为
-
reserve(n):- 只增加 vector 的 capacity (内存分配量),不改变 size
- 不会初始化任何新元素
- 不能直接访问新"空间",因为 size 没变,
operator[]和data()只保证对 [0,size) 有效
为什么你的代码需要 resize
当你使用 data() 指针直接访问时:
cosTable.data(); // 返回指向 size() 个元素的指针
resize()后:data()返回的指针指向n个有效元素reserve()后:data()仍然只指向原来的size()个元素(即使底层内存可能更大)
正确用法示例
std::vector<double> cosTable, sinTable;
// 错误:reserve 不改变 size,data() 可能返回 nullptr 或无效指针
cosTable.reserve(resamplingPointsNumber);
sinTable.reserve(resamplingPointsNumber);
// 这里访问 cosTable.data()[i] 是未定义行为 (UB)
// 正确:resize 会初始化元素
cosTable.resize(resamplingPointsNumber); // size 变为 resamplingPointsNumber
sinTable.resize(resamplingPointsNumber);
// 现在可以安全使用 data() 指针
SsuAlgorithm::generateRotationTable(cosTable.data(), sinTable.data(), resamplingPointsNumber);
何时使用 reserve
reserve() 主要用于性能优化,当你预先知道要添加大量元素时,可以避免多次重新分配:
std::vector<int> v;
v.reserve(1000); // 一次性分配足够内存
for(int i=0; i<1000; ++i) {
v.push_back(i); // 不会触发重新分配
}
在这种情况下,size() 会随着 push_back 逐渐增加,而 capacity() 保持至少 1000。

浙公网安备 33010602011771号