C++使用vector时,预先分配空间大小可以提高速度

本文通过对比C++程序中预分配内存与动态增长内存两种方式的性能差异,展示了预分配内存可以显著提高程序运行效率。通过测试函数`test()`和`test2()`,分别实现内存的预先分配和动态增长,结果表明前者运行速度明显快于后者。
// NEW.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

void test()
{
	std::vector<int> t(128,0);
	for (int i = 0;i<100000;i++){
		//std::vector<int> t;
		for(int j =0;j<128;j++){
			//t.push_back(j);
			t.at(j)=j;
		}
	}

}
void test2()
{
	//std::vector<int> t(128,0);
	for (int i = 0;i<100000;i++){
		std::vector<int> t;
		for(int j =0;j<128;j++){
			t.push_back(j);
			//t.at(j)=j;
		}
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	clock_t start = clock();
	test();
	clock_t end = clock();
	float t = (float)(end-start)/CLOCKS_PER_SEC;
	std::cout<<t;
	std::cin>>t;
}

test()预先分配空间,耗时0.73

test2()动态增长,耗时7.3


C++ Primer Fifth Edition 英文彩色带书签 http://download.youkuaiyun.com/detail/kingeasternsun/5529053
C++ Primer Plus (6th Edition)  英文原版 彩色带书签http://download.youkuaiyun.com/detail/kingeasternsun/5508691

C++ 中,为 `std::vector` 预先分配内存空间是一种优化手段,可以避免在频繁添加元素多次触发内存重新分配,从而高程序的性能。`std::vector` 供了多种方法用于预先分配或调整内存空间。 ### 使用 `reserve()` 方法 `reserve(n)` 方法用于将 `std::vector` 的容量(capacity)至少增加到 `n`,确保在添加不超过 `n` 个元素不会发生重新分配[^2]。 ```cpp std::vector<int> vec; vec.reserve(100); // 预先分配足够存储 100 个 int 的内存 ``` 调用 `reserve()` 后,`vec` 的 `size()` 保持不变,但 `capacity()` 会增加到至少 100。如果当前容量已经大于或等于 `n`,则不会进行任何操作。 ### 使用构造函数指定初始容量 在创建 `std::vector` ,可以通过构造函数指定初始容量。虽然 `std::vector` 的构造函数不直接接受容量参数,但可以通过指定初始大小来间接分配内存。 ```cpp std::vector<int> vec(100); // 创建包含 100 个默认初始化 int 的 vector ``` 该方式会将 `size` 设置为 100,同 `capacity` 至少也为 100。如果仅需要分配内存而不初始化元素,可以使用 `reserve()`。 ### 使用 `shrink_to_fit()` 调整内存 虽然 `shrink_to_fit()` 主要用于减少 `std::vector` 的容量以匹配当前大小,但在某些情况下,它也可以用于释放未使用的内存。这在处理完大量数据后希望释放多余内存非常有用。 ```cpp vec.shrink_to_fit(); // 尝试将 capacity 调整为与 size 相同 ``` ### 使用 `resize()` 方法 `resize(n)` 方法用于调整 `std::vector` 的大小,如果 `n` 大于当前大小,则会添加默认构造的元素;如果 `n` 小于当前大小,则会删除多余的元素。该方法会改变 `size()`,但不一定改变 `capacity()`。 ```cpp vec.resize(100); // 确保 vector 至少有 100 个元素 ``` 如果希望 `capacity()` 与 `size()` 一致,建议在调用 `resize()` 后使用 `shrink_to_fit()`。 ### 总结 | 方法 | 作用 | 是否改变 size | 是否改变 capacity | |--------------|--------------------------------|----------------|---------------------| | `reserve(n)` | 预留足够空间存储 `n` 个元素 | 否 | 是(至少为 `n`) | | 构造函数 | 创建指定初始大小 | 是 | 是(至少为初始大小)| | `resize(n)` | 调整元素数量 | 是 | 否(除非触发扩容) | | `shrink_to_fit()` | 减少容量以匹配 `size` | 否 | 是(可能) |
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值