|
自從上次經(jīng)歷了sort的死循環(huán)之后,讓我覺得有必要重新審視一下STL的容器。vector是STL中最普通的一個容器,也是用的最多的一個容器。當我閱讀vector的源碼后,還是發(fā)現(xiàn)有很多陷阱,這些陷阱稍不留神也許就會讓你的程序死的很難看。
一.增加元素時的陷阱 vector中常用的增加元素的方法是pushBack和insert。大家先看看這樣一段程序:
int _tmain(int argc, _TCHAR* argv[]) std::vector<int>::iterator iter1 = vec.begin(); int n = *iter1;
return 0;
n會等于多少?有人很容易就說肯定是0了。大家把這段程序運行一下就會發(fā)現(xiàn),程序執(zhí)行到倒數(shù)第二行就崩潰了。為什么會崩潰?原因當然是iter1迭代器失效了。那為什么又會失效呢?這就要好好說一下了。首先得從vector的空間配置方式說起。我們都知道vector是動態(tài)分配內存空間,很多人認為vector的空間是隨著元素的增多,空間就進行線性,連續(xù)的增長。但是卻相反,vector并不是在原空間之后連續(xù)新空間,因為無法保證原空間之后尚有可供配置的空間,而是以原大小的兩倍另外配置一塊較大的空間,然后將原內容拷貝過來,然后才開始在原內容之后構造新元素,并釋放原空間。因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就失效了。 看上面那段程序,首先構造了一個空的vector,然后加了一個元素進去。此時容器的容量是1,此時如果再增加元素,就會另外配置一塊較大的空間。當vector的元素大小為1,2,4,8,2的n次方時,再增加元素都會另外開辟空間。這時候之前容器所有的迭代器將會失效。
二.刪除元素時的陷阱 先看下面這段程序: int _tmain(int argc, _TCHAR* argv[]) std::vector<int>::iterator iter1 = vec.begin()+2; vec.erase(vec.begin()+1); int n = *iter1; return 0; 會出現(xiàn)什么問題?和上個程序一樣,崩潰。原因也很簡單,vector刪除元素后會讓該元素后面所有的迭代器都失效。
三.讀取元素時的陷阱 vector中最恐怖的就是越界了,當我們每次讀取元素時都要檢查是否超過該vector的size。另外當我們調用front和back函數(shù)時,必須檢查容器是否為空,否則也會崩潰。 |
|
|
來自: oskycar > 《c\vc\opencv》