std::vector 是 C++ 标准库中的一个动态数组容器,它允许我们在运行时动态地增加或减少元素。然而,由于 vector 在添加元素时可能需要重新分配内存并移动现有元素,这可能会导致性能问题。为了避免不必要的内存分配和元素移动,vector 提供了一个预留空间的功能,即 reserve 成员函数。通过预先分配足够的内存空间,我们可以减少因内存分配和元素移动带来的开销,提高程序的性能。
reserve 函数的作用
reserve 函数的作用是改变 vector 的容量(capacity),即预先分配一定大小的内存空间,但不改变其大小(size)。这样做的好处是,在后续添加元素时,只要不超过预留的容量,vector 就不会再进行内存分配和元素移动,从而提高了性能。
使用 reserve 的场景
通常,在知道将要向 vector 中添加大量元素时,或者在循环中反复添加元素时,使用 reserve 是很有用的。通过预先分配足够的内存空间,可以避免多次小规模的内存分配和元素移动,从而优化性能。
代码示例与讲解
下面是一个使用 reserve 的示例代码: #include <iostream>
#include <vector> #include <chrono> // 用于计时 int main() { // 不使用 reserve 的情况 { std::vector<int> vecWithoutReserve; auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) { vecWithoutReserve.push_back(i); } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> diff = end - start; std::cout << "不使用 reserve 添加 1000000 个元素的时间: " << diff.count() << " 秒" << std::endl; } // 使用 reserve 的情况 { std::vector<int> vecWithReserve; vecWithReserve.reserve(1000000); // 预留足够空间 auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 1000000; ++i) { vecWithReserve.push_back(i); } auto end = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> diff = end - start; std::cout << "使用 reserve 添加 1000000 个元素的时间: " << diff.count() << " 秒" << std::endl; } return 0; }
在这个示例中,我们创建了两个 vector 对象,一个不使用 reserve,另一个使用 reserve 预留了足够的空间。