1. 程式人生 > >STL:vector擴容、銷燬、與list和deque的區別

STL:vector擴容、銷燬、與list和deque的區別

1、vector是怎麼擴容的?

reserve()是容器預留空間,但並不真正建立元素物件。
resize()是改變容器的大小,並且建立物件。

兩個函式的形式是有區別的,reserve函式之後一個引數,即需要預留的容器的空間;resize函式可以有兩個引數,第一個引數是容器新的大小,第二個引數是要加入容器中的新元素,如果這個引數被省略,那麼就呼叫元素物件的預設建構函式。

vector<int> myVec;
myVec.reserve( 100 );     // 新元素還沒有構造,
                          // 此時不能用[]訪問元素
for (int i = 0; i < 100; i++ )
 {
     myVec.push_back( i ); //新元素這時才構造 
}
 
myVec.resize( 102 );      // 用元素的預設建構函式構造了兩個新的元素
myVec[100] = 1;           //直接操作新元素
myVec[101] = 2;

2、vector、list、deque的區別?

vector:
1、地址空間是連續的;
2、沒有容量限制、當儲存內容超過當前空間,就自動擴容;
3、支援高效的隨機訪問;
4、支援高效的尾插、尾刪,但其他位置的插入/刪除操作效率低下。

擴充空間(不論多大)都應該這樣做:
(1)配置一塊新空間
(2)將舊元素一一搬往新址
(3)把原來的空間釋放還給系統

list:
非連續儲存結構,具有雙鏈表結構,每個元素維護一對前向和後向指標,因此支援前向/後向遍歷。

優點:
(1) 不使用連續記憶體完成動態操作。
(2) 在內部方便的進行插入和刪除操作
(3) 可在兩端進行push、pop。

缺點:
(1) 不能進行內部的隨機訪問。
(2) 相對於verctor佔用記憶體多。

使用區別:
(1)需要高效的隨即存取,不在乎插入和刪除的效率,使用vector。
(2)需要大量的插入和刪除,而不關心隨機存取,則應使用list。
(3)需要隨機存取,而且關心兩端資料的插入和刪除,則應使用deque。

deque:

deque是在功能上合併了vector和list。
優點:
(1) 隨機訪問方便。
(2) 在內部方便的進行插入和刪除操作。
(3) 可在兩端進行push、pop。

缺點:佔用記憶體多
使用區別:

(1)需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector。
(2)需要大量的插入和刪除,而不關心隨機存取,則應使用list。
(3)需要隨機存取,而且關心兩端資料的插入和刪除,則應使用deque。

迭代器區別:
vector與deque的迭代器支援算術運算,list的迭代器只能進行++/–操作,不支援普通的算術運算。

vector中的iterator在使用後就釋放了,但是連結串列list不同,它的迭代器在使用後還可以繼續用;連結串列特有的。

ite=find(vec.begin(),vec.end(),88);
vec.insert(ite,2,77);  //迭代器標記的位置前,插入資料;
cout<<*ite<<endl;  //會崩潰,因為迭代器在使用後就釋放了,*ite的時候就找不到它的地址了;

3、vector怎麼銷燬空間?

第一步:先產生一個和原先一樣的臨時物件
第二步:臨時量呼叫swap()函式兩者進行交換。
第三步:語句結束,臨時量自動析構。
    vector<int>().swap(vec);
	/*
	vector<int>(vec).swap(vec);  ===>   vec.swap(vector<int>())
	*/

使用clear()和erase()兩個函式只是清空元素,但不回收記憶體。

先使用clear()再使用swap(),釋放空間並且回收記憶體。