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