resize() 和 reserve()

关键区别

方法 容量变化 大小变化 元素初始化 数据可访问性
resize(n) 可能增加 设置为n 新元素被值初始化 可立即访问[0,n)
reserve(n) 增加到至少n 不变 不初始化新元素 仅可访问原大小范围内的元素

详细解释

  1. resize(n):

    • 将 vector 的 size (实际元素数量) 改为 n
    • 如果 n 大于当前 size,会添加新元素并值初始化它们
    • 你可以立即访问这些新元素(如 cosTable[0]cosTable[n-1]
  2. 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。

posted @ 2025-04-18 09:53  BlackSnow  阅读(59)  评论(0)    收藏  举报