STL使用入門( Using STL) 【轉貼】

STL使用入門( Using STL)

作者:Zoran M. Todorovic
原文:Using STL.
翻譯:Winter

0 前面的話(Winter)

C++已經在中國相當普及,但C++ STL卻使用的人不多。許多人有一定成見,認爲STL降低了C++的效率。特別是那些自詡爲技術專家的人,他們一直使用C語言,對於新事物總是先用批判的眼光對待......先不說這些,我這幾天看見http://stl.winterxy.com網站上的這篇小文,發現寫得簡明扼要,通俗易懂。翻譯出來,希望對STL的普及有一定幫助。

1 介紹

我最開始結束C++編程是從DOS下的Borland C++開始的。那時他們在最新版本3.1中就包含了一套模板庫用來做collection.那真是個好東東。當我開始使用Visual C++ 2.2的時候,我甚至試圖去把Borland公司的collection模板庫嵌入到Visual C++中去,但是沒有成功。唯一可行的解決方案是切換到微軟(Microsoft)的collection上,它是MFC的一部分分。但總是有些問題,其原因如下:

  • 一旦實現部分已經代碼寫完,很難從一種容器(container)類型切換到另外一種容器。
  • 不同容器的迭代器(Iterators)不一樣。
  • 如果你在寫一個DLL(動態鏈接庫), 服務程序(service)或者終端應用程序,需要用到容器,你要麼動態要麼靜態鏈接MFC,這使得你不得不依賴於MFC.

最近我開始使用STL,發現它真是太棒了!入門可能稍微難一些,但一旦你開始了,它就變得非常容易。本文包含了一些使用STL的入門經驗,主要是面向那些希望能快速使用STL又不想了解那些瑣碎細節的程序員。

2 規則

Rule 1:

你可以生成STL容器,用來存放對象或者指向對象的指針。

 TMyClass;
 list<TMyClass> TMyClassList;     
 list<TMyClass*> TMyClassPtrList; 
一般來說,list容器用於存放對象。但是,如果你是需要保存一些機器資源(例如,文件句柄,命名管道、套接字(socket)或者其他類似的資源),那麼你需要使用list來保存指向這些對象的指針。

如果容器是保存的對象,則在容器析構的時候會自動清理這些對象。但,如果它保存的是對象的指針,刪除指針就應該是程序員的責任了。

Rule 2

對需要保存到容器中的對象的類型來說,每個類都必須至少實現拷貝構造函數,最好還能重載賦值操作符。

 TMyClass {
        :
        ...
        :
        TMyClass(..);
        
        
        TMyClass( TMyClass& obj)  { * = obj; }
        
        
        TMyClass& =( TMyClass& obj);    
        ...
};
當你把一個對象的實例插入到容器中,STL會自己重新生成一個此對象的拷貝,因此拷貝構造函數就成爲必須的了。如果你沒有爲拷貝構造函數寫正確的代碼,就有可能造成list中對象的某些數據成員沒有初始化。

Rule 3:

按照下列方式把一個對象插入到容器中:

TMyClass object;
TMyClassList myList;
TMyClassList::iterator it;

it = myList.insert(myList.end(), object);
TMyClass *pObject = &(*it);
上面的例子顯示瞭如何把一個對象插入容器中,並得到這個在容器中的對象的指針。由於容器將會爲這個對象產生一個新的拷貝,原始的那個對象實例就不再使用了,因此得到其指針是很有必要的。若你是用list來保存指針,這個操作就沒有多大必要了,因爲原始的指針會被保存到容器中。

Rule 4:

通過下面的方式,使用迭代器遍歷整個容器:

TMyClassList::iterator it;
TMyClass *pObject;
 (it = myList.begin(); it != myList.end(); it ++) {
        pObject = &(*it);
        
}
不過,若你是用容器來保存對象的指針,上面的代碼需要做如下修改:
TMyClassList::iterator it;
TMyClass *pObject;
 (it = myList.begin(); it != myList.end(); it ++) {
        pObject = *it;
        
}

Rule 5:

按照下面的方法可以刪除容器中的元素:

TMyClassList::iterator it;
TMyClass *pObject;
 (it = myList.begin(); it != myList.end(); it ++) {
        pObject = &(*it);
         (pObject 滿足某些刪除的標註) then
        myList.erase(it);
        
         pObject;
}
容器不會刪除其保存的指針,需要手動刪除,因此再上面代碼中增加了額外一行。

3 結論

STL中唯一缺少的一個函數就是CString::Format() .

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章