最近在做項目的時候敲才,看到這樣一個代碼:vector.reserve(mesh.n_vertices())我對這個reserve產(chǎn)生了好奇拒炎,查閱資料后挪拟,對reserve和resize有了更深的理解。
vector
在介紹resize()击你,reserve()玉组,size()和capacity()函數(shù)之前,先簡單介紹一下c++中vector的概念丁侄。
vector:順序容器(可變大小數(shù)組)惯雳。支持快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢鸿摇。
既然vector是個容器石景,那么一定相關(guān)特性,如添加元素拙吉、刪除元素和查詢?nèi)萜鞔笮〉炔僮鞒蹦酢1疚闹攸c介紹vector中的resize(),reserve()庐镐,size()和capacity()函數(shù)恩商。
基本概念
capacity
指容器在分配新的存儲空間之前能存儲的元素總數(shù)。
size
指當前容器所存儲的元素個數(shù)
注:capacity是容器可存儲的最大總數(shù)必逆,size是當前容器存儲的個數(shù)怠堪。
resize
既分配了空間,也創(chuàng)建了對象名眉。默認初始化為0
這里空間就是capacity粟矿,對象就是容器中的元素。
reserve
reserve()表示容器預(yù)留空間损拢,但不是真正的創(chuàng)建對象陌粹,需要通過insert()或push_back()等操作創(chuàng)建對象。
其實size()和capacity()沒有更多需要介紹的地方福压,大家平時coding時直接調(diào)用即可掏秩。當然size()的使用頻率相當高或舞,通常進行遍歷操作時,最外層的for循環(huán)的次數(shù)即為size()蒙幻。
reserve或resize的意義
我們都知道映凳,vector是一個可變大小的容器,不管你用不用reserve或者resize邮破,你都可以使用push_back()函數(shù)往容器里添加元素诈豌,但是stl中為什么要有reserve或者resize呢?
因為當你push_back()時抒和,如果size將要超過capacity矫渔,那么vector就會為你動態(tài)分配內(nèi)存,通過一組實驗結(jié)果可以看到摧莽,大小是capacity的一半庙洼。
int nums = 20;
for (int i = 0; i < nums; ++i){
v2.push_back(i+1);
cout << "v2_size: " << v2.size() << "\t v2_capacity: " << v2.capacity() << endl;
}
讓我們直接看結(jié)果:
v2_size: 2 , v2_capacity: 2
v2_size: 3 范嘱, v2_capacity: 3
v2_size: 4 送膳, v2_capacity: 4
v2_size: 5 , v2_capacity: 6
v2_size: 6 丑蛤, v2_capacity: 6
v2_size: 7 , v2_capacity: 9
v2_size: 8 撕阎, v2_capacity: 9
v2_size: 9 受裹, v2_capacity: 9
v2_size: 10 , v2_capacity: 13
v2_size: 11 虏束, v2_capacity: 13
v2_size: 12 棉饶, v2_capacity: 13
v2_size: 13 , v2_capacity: 13
v2_size: 14 镇匀, v2_capacity: 19
v2_size: 15 照藻, v2_capacity: 19
v2_size: 16 , v2_capacity: 19
v2_size: 17 汗侵, v2_capacity: 19
v2_size: 18 幸缕, v2_capacity: 19
v2_size: 19 , v2_capacity: 19
v2_size: 20 晰韵, v2_capacity: 28
v2_size: 21 发乔, v2_capacity: 28
當你把特別大的數(shù)據(jù)輸入到一個vector時,這個分配內(nèi)存的操作就會頻繁發(fā)生雪猪,這顯得非常的低效栏尚,比如我想把一個模型文件.obj輸入到vector中,幾十萬甚至上百萬點的輸入就會多次分配內(nèi)存只恨,而如果一開始通過reserve指定分配內(nèi)存大小译仗,就會高效的多抬虽。
總結(jié)
- size():返回vector中的元素個數(shù)
- capacity():返回vector能存儲元素的總數(shù)
- resize()操作:創(chuàng)建指定數(shù)量的的元素并指定vector的存儲空間
- reserve()操作:指定vector的元素總數(shù)