本文面向的讀者:學習過C++程序設計語言(也就是說學習過Template),但是還沒有接觸過STL的STL的初學者。這實際上是我學習STL的一篇筆記,老鳥就不用看了。
什麼是泛型程序設計
我們可以簡單的理解為:使用模板的程序設計就是泛型程序設計。就像我們我們可以簡單的理解面向對象程序設計就是使用虛函數的程序設計一樣。
STL是什麼
作為一個C++程序設計者,STL是一種不可忽視的技術。Sandard Template Library (STL):
標准模板庫,更准確的說是 C++ 程序設計語言標准模板庫。學習過MFC的人知道,MFC是微軟公司創建的 C++ 類庫。而與之類似的是 STL 是模板庫,只不過 STL 是 ANSI/ISO 標准的一部分,而 MFC 只不過是微軟的一個產品而已。也就是說STL是所有C++編譯器和所有操作系統平台都支持的一種庫,說它是一種庫是因為,雖然STL是一種標准,也就是說對所有的編譯器來說,提供給C++程序設計者的接口都是一樣的。也就是說同一段STL代碼在不同編譯器和操作系統平台上運行的結果都是相同的,但是底層實現可以是不同的。 令人興奮的是,STL的使用者並不需要了解它的底層實現。 試想一下,如果我們有一把能打開所有鎖的鑰匙,那將是多麼令人瘋狂啊。嘎嘎。這個歪夢我做了20多年鳥。
STL的目的是標准化組件,這樣你就不用重新開發它們了。你可以僅僅使用這些現成的組件。STL現在是C++的一部分,因此不用額外安裝什麼。它被內建在你的編譯器之內。
為什麼我們需要學習STL
STL是 C++的ANSI/ISO 標准的一部分,可以用於所有C++語言編譯器和所有平台(Windows/Unix/Linux..)。STL的同一版本在任意硬件配置下都是可用的;
STL 提供了大量的可復用軟件組織。例如,程序員再也不用自己設計排序,搜索算法了,這些都已經是STL的一部分了。嘎嘎,有意思吧;
使用STL 的應用程序保證了得到的實現在處理速度和內存利用方面都是高效的,因為STL設計者們已經為我們考慮好了;
使用STL編寫的代碼更容易修改和閱讀,這是當然的鳥。因為代碼更短了,很多基礎工作代碼已經被組件化了;
使用簡單,雖然內部實現很復雜;
雖然,STL的優點甚多,但是STL的語法實在令初學者人頭疼,許多人望而卻步。可是STL是每個C++程序設計者遲早都要啃的一塊骨頭。因為越來越多的C++代碼是用STL編寫的,看不懂麻煩就大鳥。越來越多的人在用STL,不懂就無法和別人一起合作了。好事多磨嘛,早點學習早點解脫。
下面讓我們來看幾段代碼吧:(你覺得頭疼就不要看了)
//stl_cpp_1.cpp
#include <iostream>
double mean(double *array, size_t n)
{
double m=0;
for(size_t i=0; i<n; ++i){
m += array[i];
}
return m/n;
}
int main(void)
{
double a[] = {1, 2, 3, 4, 5};
std::cout<<mean(a, 5)<<std::endl; // will print 3
return 0;
}
好懂吧,除了那個std有點讓人不舒服以外?這是一段普通的沒有使用STL的C++代碼。再看下面一段:
//stl_cpp_2.cpp
#include <vector>
#include <iostream>
int main(void)
{
std::vector<double> a;
std::vector<double>::const_iterator i;
a.push_back(1);
a.push_back(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
for(i=a.begin(); i!=a.end(); ++i){
std::cout<<(*i)<<std::endl;
}
return 0;
}
如果你真的沒有接觸過STL的話,你會問,呀,vector 是啥呀?我會告訴你,那是一排美女。嘎嘎。這可不是個比喻,表想歪鳥。這是一段純種的STL代碼,看到尖括號了吧,知道那是模板了吧。看到a.push_back(5),a.begin(),a.end()你不感覺奇怪麼?可是我們並沒有定義這些函數啊。
//stl_cpp_3.cpp
#include <vector>
#include <iostream>
int main(void)
{
std::vector<int> q;
q.push_back(10);
q.push_back(11);
q.push_back(12);
std::vector<int> v;
for(int i=0; i<5; ++i){
v.push_back(i);
}
std::vector<int>::iterator it = v.begin() + 1;
it = v.insert(it, 33);
v.insert(it, q.begin(), q.end());
it = v.begin() + 3;
v.insert(it, 3, -1);
it = v.begin() + 4;
v.erase(it);
it = v.begin() + 1;
v.erase(it, it + 4);
v.clear();
return 0;
}
這一段你又看到了新東西了吧,iterator???不羅嗦了,等你看完這篇文章,回頭再看就簡單了。在正式介紹STL之前,我們需要花點時間來了解一下模板和命名空間。
關於模板的其他細節,讀者可以參閱《C++ Templates 中文版》(有點費腦子哦)。在這裡,我只簡單的介紹一下模板類和函數模板的概念。
模板是C++中實現代碼重用機制的一種工具,可以實現類型參數化,把類型定義為參數。函數模板和類模板允許用戶構造模板函數和模板類。
圖1