使用reserve來避免不必要的重新分配
本節講解reserve操作的優勢,以及重新分配的代價
先來講一下重新分配的代價:
1.分配新的內存塊,一般vector和string是成倍增加內存
2.把所有元素從容器的舊內存拷貝到它的新內存
3.銷燬舊內存對象
4.回收舊內存
可以看出,重新分配內存的操作是非常耗時的。
接着,解釋一下以下幾個迭代器函數的功能:
1.size告訴你容器中有多少元素
2.capacity告訴你容器中最多能容納多少元素
3.resize函數強制把容器容量改爲容納n個元素,如果n小於當前size返回大小,容器尾部的元素會被銷燬。如果n大於當前size大小,新默認的元素會添加到容器尾部。如果n大於當前capacity,在元素加入之前發生重新分配
4.reserve強制容器的容量改爲至少n,如果n小於當前容量,vector忽略,n大於就重新分配內存。
最後,比較下面兩個代碼:
代碼1:
vector<int>v;
for(int i=1;i<=1000;i++)
v.push_back(i);
代碼2:
vector<int>v;
v.reserve(1000);
for(int i=1;i<=1000;i++)
v.push_back(i);
代碼1會導致2到10次重新分配
代碼2不會導致重新分配
爲了提高程序執行速度,避免容器內存重新分配很重要!