STL常見問題工具書是今年最新最全的工具資料內(nèi)容,是編程人員在從事工作期間必須要用到的一些東西,有了它你的工作可以更加輕松,每天的工作時間會大大縮短,讓你的編程從此更加厲害,需要的下載吧。
STL常見問題工具書說明:
Q:以下兩種定義方式,在進行map.clear()的時候,內(nèi)存釋放上有啥不同?
typedef map<CString,CFileAttribute> MAPStr2FileAttr;
typedef map<CString,CFileAttribute *> MAPStr2FileAttr;
A:clear()相當于earse(m.begin(), m.end());
若定義的map的存儲對象是一個類對象:
拷貝是整個STL(Standard Template Library,標準模板庫)工作的方式,所以容器中保存的是副本,而不是要添加的對象本身。對象原件在副本拷貝存放結(jié)束后便可以結(jié)束生命,而在使用clear()的時候,對象副本會去走到析構(gòu)函數(shù),進行對象內(nèi)部的內(nèi)存釋放。clear()后,對象拷貝被析構(gòu),剩下的只是raw memory,即沒有被初始化的內(nèi)存,它們將被歸還到stl的內(nèi)存分配器alloc里的(記得嗎,vector/list等所有容器都有一個alloc參數(shù)的,就是這東西),容器本身已經(jīng)不再擁有這塊內(nèi)存了。內(nèi)存歸還了,只不過不是歸還入系統(tǒng)堆而已。(除了vector不能(自動)釋放內(nèi)存,其它STL容器都會在每一個erase動作后釋放一塊內(nèi)存。)
若定義的map存儲對象是一個類對象的指針:
這時一般不能采用clear()函數(shù),因為clear()不會自動釋放原來對象所占用的內(nèi)存。這時可以使用erase()輔助delete語句進行元素刪除和內(nèi)存釋放。
上面這句話我是這樣理解的,因為存入的是指針,這個指針指向一塊區(qū)域(new出來的,eg:class A, A *a = new A()),但是畢竟map里面的value值是個指針,就是一個地址而已,因此在clear的時候只是把指針清除掉了,而指針指向的內(nèi)容依舊存在。因此一般要在clear之前先釋放掉這些個指針指向的空間。
另外使用的是類對象指針時,還需要維護這個指針不受到破壞。
小結(jié):
如果用容器存副本,則容器銷毀的時候,副本也會自動被刪除。
如果用容器存指針,則容器銷毀的時候,不會刪除這些指針所指向的對象,因此必須先手工刪除完畢之后,再銷毀容器。
Q: 對由key得到的value對象,沒有辦法改變其中的數(shù)值嗎??
例如下代碼:
//srcfileAttribute.nIndex初始為0
CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
srcfileAttribute.nIndex++;
但是再次CFileAttribute srcfileAttribute = m_mapKeyVsFile[“abc”];
發(fā)現(xiàn)這個srcfileAttribute.nIndex還是0;并沒有變成1,
這是為什么呢??
難道說我不能這樣直接改map里面的value值嗎?必須刪除重新insert一個??
A:srcfileAttribute = m_mapKeyVsFile[“abc”];此時srcfileAttrbute是通過map中值的拷貝構(gòu)造函數(shù)構(gòu)造的一個新的對象,這個副本的改變不影響map中的值,要改變map中的值可以直接m_mapKeyVsFile[“abc”].nIndex++;
如果用容器存副本,其存入、取出的過程是通過拷貝構(gòu)造函數(shù) 和 賦值操作符來進行的。
關(guān)于STL:
STL(Standard Template Library)標準模板庫,惠普實驗室開發(fā)的一系列軟件的統(tǒng)稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發(fā)出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有l(wèi)ist,vector,set,map等,STL也是算法和其他一些組件的集合。這里的“容器”和算法的集合指的是世界上很多聰明人很多年的杰作。STL的目的是標準化組件,這樣就不用重新開發(fā),可以使用現(xiàn)成的組件。STL現(xiàn)在是C++的一部分,因此不用額外安裝什么。
- PC官方版
- 安卓官方手機版
- IOS官方手機版