std::vector 如何调整其内部缓冲区的大小?

Luc*_*ong 5 c++ stl

据我所知,C++不支持C语言中的“realloc(void *, size_t)”这样的运算符。

但是,std::vector 应该有一个缓冲区来包含数据,并且应该扩展或压缩该缓冲区。

那么如何在没有“realloc”函数的情况下调整 std::vector 缓冲区的大小呢?

是否可以通过分配新的缓冲区、复制或移动所有元素并销毁以前的缓冲区来完成?我认为这是低效的。

eer*_*ika 6

据我所知,C++不支持像“realloc(void *, size_t)”这样的运算符

C++ 确实有std::realloc. 但它不(通常?)用于实现向量的大小调整。

那么如何在没有“realloc”函数的情况下调整 std::vector 缓冲区的大小呢?

使用以下算法:

  • 分配新数组
  • 将内容复制或移动到新数组
  • 释放旧数组

是否可以通过分配新的缓冲区、复制或移动所有元素并销毁以前的缓冲区来完成?

是的。

我认为这是低效的。

你为什么这么认为?正是如此realloc。​ 当然,有时realloc可能能够根据内存布局跳过复制,而向量通常不能。与手动动态数组相比,这是矢量的一个不幸的缺点,但它不一定是一个显着的缺点。malloc

有人建议向标准分配器添加重新分配支持,如果采用标准分配器,将允许进行相同的优化:http://open-std.org/JTC1/SC22/WG21/docs/papers/2019/p0894r1.md