C++ Tips: 標準庫概覽

 

3.1 不要像重新發明車輪那樣企圖做每件事,去使用庫。
<<Effective STL>>包含了關於如何使用STL的很多寶貴建議。如Item 13解釋了爲什麼vector和string優先於動態的數組。Item 43解釋了算法調用優先於手寫循環。還有關於關聯容器,函數對象,迭代器的用法和注意事項。用STL寫程序時可以作爲參考。
 
3.2 不要相信奇蹟,要理解你的庫能做什麼,它們如何做,它們做時需要多大的代價。
對STL有了全局的,深入的瞭解後,才能知道它能做什麼,如何做,在什麼樣的情況下選擇什麼樣的容器和算法。
 
3.3 當你遇到一個選擇時,應該優先選擇標準庫而不是其他的庫。
C++庫有很多,如STL,BOOST,LOKI,BLITZ++,POOMA等等。從移植性,維護性,可讀性,可擴展性等方面來說,我們總是應該優先選擇標準庫。
 
3.4 不要認爲標準庫對於任何事情都是最理想的。
不要把標準庫看成神,如標準庫中的valarray,並沒有用表達式模板這樣的高級技術去進行優化,所以並不是一個最優的實現。
 
3.5 切記#include你所用到的功能的頭文件。
標準庫的功能都是通過某個像<iostream>這樣的頭文件提供的。例如,要用vector的功能就要#include<vector>。C++標準並沒有規定標準庫的各個頭文件的組織關係,所以對於不同的標準庫實現,頭文件的組織可能會不同。打個比方,有的實現可能會在頭文件<vector>中包含find函數,而有的卻不會,所以要使用find函數,就必須明確的包含<algorithm>,而不能依靠#include <vector>來完成。另外,對於<iostream>如果在頭文件中並沒有用到流的完整定義,那麼#include<iosfwd>就可以了,它裏面是一些流的聲明。
<<Effective STL>> Item 48 中有這方面更詳細的解釋。
 
3.6 記住,標準庫的功能定義在名字空間std之中。
標準庫的功能定義在名字空間std之中,例如可以用std::string來使用string,或者用using namespace std; 使所有的std中的名字可用,而不必加std::前綴。但通常這種將所有名字都放入全局名字空間並不是一種好的做法。對於大程序,使用std::string或者using std::string; 單獨把string引入全局名字空間更好。
 
3.7 請用string,而不是char*
標準庫的string有一百多個成員函數,提供了豐富的功能,如拼接、比較、查找、替換、刪除等,並且可以自動管理內存。所以使用string會讓程序更加簡潔安全。無論何時,如果你在使用char*請考慮是否使用string來代替更合適。
<<Effective STL>> Item 13解釋了string優先於字符數組。
 
3.8 如果懷疑,就用一個檢查區間範圍的向量。
    下面給出了一個類Vec,它就像是一個vector,當下標超出區間範圍,它將拋出out_of_range異常。
template<class T> class Vec: public vector<T>{
public:
      Vec() : vector<T>() { }
      Vec(int s) : vector<T>(s) { }
      T& operator[](int i) {return at(i);}
      const T& operator[](int i) const {return at(i);}
};
這個小例子也展示了怎樣繼承標準庫的功能。這裏用了public繼承,因爲Vec和vector符合IS-A關係。或者用組合也可以。單獨調用vector的at方法也可以,但要使用二維數組就不太直觀,比如要訪問一個元素vector< vector <int> > v;用v.at(i).at(j)纔可以。對於Vec<Vec<int> > v;用v[i][j]就可以了。
 
3.9 vector<T>、list<T>和map<key,value>都比T[]好。
   vector<T>list<T>map<key,value>要比使用C風格的數組更好因爲這樣就不用去管理內存並且使程序簡潔、安全、高效。
<<Effective STL>> Item 13Item 18解釋了vector優先於數組和使用vector的一些技巧。
 
3.10 如要向一個容器中添加一個元素push_back()back_inserter()
     push_back()在容器的最後添加元素,可以根據需要擴展內存。back_inserter()同樣在容器的最後添加元素,並根據需要擴充容器,可以方便的和算法結合使用。例如,
vector<int> v; list<int> l; copy(v,begin(), v,end(),back_inserter(l) );
<<Effective STL>> Item 30 中有這方面更詳細的解釋和應注意的問題。
 
3.11 採用對vector的push_back(),而不是對數組的realloc()
     vector的push_back()可以根據需要擴展內存,這是在容器內部自動完成的,而不像realloc()要提供額外的參數,從而push_back()更安全。方便。
 
3.12 在main()中捕捉公共的異常。
     可以讓main()以一個try塊作爲主體,從而使異常所造成的奇怪現象最小化,例如,
int main()
try{
   //your code
}
catch(…)
{
   cerr << “unknown exception thrown./n”;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章