當(dāng)一個結(jié)構(gòu)體數(shù)組大小大概為5000的樣子就超出內(nèi)存,vector底層實現(xiàn)機(jī)制是基于deque的,下面是簡短的一個關(guān)于vector的簡短描述。
1.vector
vector就是動態(tài)數(shù)組.它也是在堆中分配內(nèi)存,元素連續(xù)存放,有保留內(nèi)存,如果減少大小后,內(nèi)存也不會釋放.如果新值>當(dāng)前大小時才會再分配內(nèi)存.
它擁有一段連續(xù)的內(nèi)存空間,并且起始地址不變,因此它能非常好的支持隨即存取,即[]操作符,但由于它的內(nèi)存空間是連續(xù)的,所以在中間進(jìn)行插入和刪除會造成內(nèi)存塊的拷貝,另外,當(dāng)該數(shù)組后的內(nèi)存空間不夠時,需要重新申請一塊足夠大的內(nèi)存并進(jìn)行內(nèi)存的拷貝。這些都大大影響了vector的效率。
對最后元素操作最快(在后面添加刪除最快 ), 此時一般不需要移動內(nèi)存,只有保留內(nèi)存不夠時才需要
對中間和開始處進(jìn)行添加刪除元素操作需要移動內(nèi)存,如果你的元素是結(jié)構(gòu)或是類,那么移動的同時還會進(jìn)行構(gòu)造和析構(gòu)操作,所以性能不高 (最好將結(jié)構(gòu)或類的指針放入vector中,而不是結(jié)構(gòu)或類本身,這樣可以避免移動時的構(gòu)造與析構(gòu))。
訪問方面,對任何元素的訪問都是O(1),也就是是常數(shù)的,所以vector常用來保存需要經(jīng)常進(jìn)行隨機(jī)訪問的內(nèi)容,并且不需要經(jīng)常對中間元素進(jìn)行添加刪除操作.
相比較可以看到vector的屬性與string差不多,同樣可以使用capacity看當(dāng)前保留的內(nèi)存,使用swap來減少它使用的內(nèi)存.
capacity()返回vector所能容納的元素數(shù)量(在不重新分配內(nèi)存的情況下) 測試push_back 1000個數(shù)據(jù) capacity返回16384
總結(jié)
需要經(jīng)常隨機(jī)訪問請用vector
參考文章:http://blog.csdn.net/lmh12506/article/details/8445025
在這個程序里,我用了結(jié)構(gòu)體,所以每次申請內(nèi)存時會調(diào)用構(gòu)造函數(shù),造成效率不高。
1 struct milk{
2 int percost;
3 int facmount;
4 bool operator <(const milk &m1) const{
5 return percost<m1.percost;
6 }
7 };
在這樣的情況下,能夠確定大小的還是定義一個靜態(tài)數(shù)組比較好。