避免 vector 扩容
时间: 2024-07-14 12:00:42 浏览: 134
避免向 `std::vector` 进行不必要的扩容可以通过预先分配足够的空间、使用 `reserve()` 方法以及合理设计向量元素的增长策略来实现。
1. **预先分配空间**:在你知道将要添加的元素数量时,可以使用 `vector::resize()` 或者 `vector::push_back()` 后跟指定大小,一次性分配所需的内存,减少频繁扩容。
```cpp
std::vector<int> vec;
int n = ...; // 预测的元素数量
vec.reserve(n); // 预先分配空间
```
2. **`reserve()` 方法**:在向 `vector` 添加元素之前,可以使用 `reserve()` 方法预设其容量,这样在后续添加元素时,只要不超过预先设定的容量,就不会触发扩容。
```cpp
vec.reserve(vec.size() + n); // 在现有元素基础上增加n个
```
3. **增长策略**:如果数据量不确定但有一个增长趋势,可以定期评估并调整容量。例如,每次扩容时增加一倍的空间,直到达到某个最大值。
```cpp
size_t initial_capacity = 10;
while (true) {
if (vec.capacity() >= target_capacity) break;
vec.reserve(vec.capacity() * 2); // 每次翻倍容量
}
```
4. **避免频繁修改容器内部结构**:尽量减少对容器内部元素的移动,因为这可能会导致扩容。如果可能,使用 `insert()` 或 `emplace_back()` 在容器尾部添加新元素,而不是直接修改容器内容。
5. **使用`span`或`piecewise_construct`**:对于大量数据,可以考虑使用 `std::span` 或 `std::vector::emplace_back(std::span)`,它们可以在不拷贝数据的情况下插入数据,从而减少扩容。
阅读全文