顺序容器:vector的自增长特性

一、vector储存元素的方式:

vecto内的元素是连续储存的,当往vector中添加元素时,如果容器中已经没有空间容纳新的元素,由于元素必须连续存储以便索引访

问,所以不能在内存中随便找个地方存储这个新元素。于是,vector 必须重新分配存储空间,用来存放原来的元素以及新添加的元素:

存放在旧存储空间中的元素被复制到新存储空间里,接着插入新元素,最后撤销旧的存储空间。


对于不连续存储元素的容器,不存在这样的内存分配问题。例如,在 list 容器中添加一个元素,标准库只需创建一个新元素,然后将

该新元素连接在已存在的链表中,不需要重新分配存储空间,也不必复制任何已存在的元素。


对于大部分应用,使用 vector 容器是最好的。原因在于,标准库的实现者使用这样内存分配策略:以最小的代价连续存储元素。由此

而带来的访问元素的便利弥补了其存储代价。vector 容器预留了这些额外的存储区,用于存放新添加的元素。于是,不必为每个新元

素重新分配容器。

二、vector的size与capacity的区别,以及reserve操作:

void test_vector_capacity_1()
{
	std::vector<int> vec;
	std::cout << "size:" << vec.size() << std::endl;			//size:0
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:0
	// 空vector的size和capacity大小都默认为0

	vec.push_back(100);
	std::cout << "size:" << vec.size() << std::endl;			//size:1
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:1

	vec.push_back(101);
	std::cout << "size:" << vec.size() << std::endl;			//size:2
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:2
}

void test_vector_capacity_2()
{
	std::vector<int> vec;
	for( int i = 0; i != 24; ++i )
	{
		vec.push_back(i);
	}
	std::cout << "size:" << vec.size() << std::endl;			//size:24
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:28
	// 预留50个元素的存储空间,即capacity至少为50
	vec.reserve(50);
	std::cout << "size:" << vec.size() << std::endl;			//size:24
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:50

	// 将预留的容量用完:
	while( vec.size() != vec.capacity() )
	{
		vec.push_back(10);
	}
	std::cout << "size:" << vec.size() << std::endl;			//size:50
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:50
	/*
	使用reserve预留了50容量,因此 vector在每次添加元素时不必做任何的内存分配工作。事实上,只要有剩余的容量,vector
	就不必为其元素重新分配存储空间。当把预留容量使用完后,如果要添加新的元素,vector 必须为自己重新分配存储空间
	*/
	vec.push_back(11);
	std::cout << "size:" << vec.size() << std::endl;			//size:51
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:75,重新分配储存空间

	vec.reserve(70);
	std::cout << "size:" << vec.size() << std::endl;			//size:51
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:75
	/*
	调节容量为70但小于上一次分配的容量75,此时容量并不会改变,容器的元素个数也不会改变
	*/
	vec.reserve(40);
	std::cout << "size:" << vec.size() << std::endl;			//size:51
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:75

	// 需要调节的容量为100,大于75,则此时的容量为100
	vec.reserve(100);
	std::cout << "size:" << vec.size() << std::endl;			//size:51
	std::cout << "capacity:" << vec.capacity() << std::endl;	//capacity:100

}

三、vector容器的储存空间分配策略:

创建空的vector对象时容量为0,当现有容量用完后,重新分配空间时容量的增幅为原容量的1/2(整除2的结果),如果增幅小于1,则

取1,reserve操作将容量设定为指定大小。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值