本文共 1299 字,大约阅读时间需要 4 分钟。
转载原文地址:
关于vector,始终记住它必须使用的连续空间的一片内存:
在push_back的过程中,如果采用的方式是:
vector<int>v;
v.push_back(1);
std::vector<int>::iterator iter1 = v.begin();
v.push_back(2);v.push_back(3);
v.push_back(4);
v.push_back(5);
一开始没有设定好vector的大小,每来一个元素,就意味着会重新开辟空间,拷贝元素,这样不仅仅时间复杂度上很高。而且在重新开辟空间之后,原来的指向第一个元素的迭代器,也就是那个指针无法使用了。
这时reserve函数的作用就体现出来了,如果一开始预留的空间足够大,也就是capacity足够使用,那么在这个过程中,不用重新开辟空间,这样原来的迭代器还可以使用,这就是reserve的作用。
所以
避免内存重新配置的方法(尽量避免迭代器的失效)
可以使用Reserve()保留适当容量 在创建容器后,第一时间为容器分配足够大的空间,避免重新分配内存。std::vector<int> v;//create an empty vector
v.reserve(80);// reserve memory for 80 elements这样在pushback的过程中,在不超过capacity之前,都不需要重新开辟空间,迭代器都不会失效。
同时也可以使用resize的方法为接下来的数据预留空间,只不过使用resize会使得capacity变得比当前的size更大。
下面说一下关于reserve和resize之间的区别:
在前面如果说使用reserve(10)
将容器的大小设置成10
那么之后每次push_back的过程中,在数量小于10的情况下,不会去重新开辟内存空间,然后进行数据的拷贝等等操作。
减少内存拷贝的复杂,和迭代器的失效等问题
如果说设置成resize,此时空间size为10,且capacity为10,并且里面被填充上了0,
即使之后push_back(1),这时因为capacity已经满了,此时还是需要重新开辟内存空间,之前的迭代器失效
那么此时设置resize的目的在哪呢?因为此时再次开辟空间的时候,因为有一个基数10在那,所以在进行空间开辟的时候,之间去另一个内存空间处,开辟出15大小的capacity。这样在接着进行push_back的过程中,就可以减少空间的开辟次数。
reserve和resize之间的区别:
1.reserve是开辟一段空的空间,push_back的过程中直接往里面插入数据,设置的大小就是capacity的大小
2.resize是开辟一段空间,但是全部填充元素0,push_back是在后面接着添加,但是不可避免的是,第一步就要重新开辟空间,而resize的初始值的意义只是有一个基数在那,使得capacity无论是以1.5还是2倍都会减少内存开辟的次数
共同点:
都可以用来一开始的空间预留,减少内存开辟的次数,和迭代器失效的次数。