STL原始碼剖析(一)
歡迎大家來訪二笙的小房子,一同學習分享生活!
寫在前面
學習STL,瞭解STL的歷史與發展,深度剖析STL原始碼,提高自己的程式設計能力!!!
1.瞭解STL
1.1 STL概述
- STL誕生:為了建立資料結構和演算法的一套標準,並且降低其間的耦合關係以提升各自的獨立性、彈性、互動操作性,從而誕生了STL
- STL的價值: 1.STL帶給我們一套極具實用價值的零部件,以及一個整合的組織 2.還帶給我們一個高層次、以泛型思維為基礎的、系統化的、條理分明的軟體元件分類學
- STL所實現的,是依據泛型思維架設起來的一個概念結構
1.2 STL的歷史
1.3 STL六大元件
等具體學到那一部分時再具體說明
1.容器:各種資料結構,如vector、list、deque、set、map 2.演算法:各種常用演算法,如sort、search 3.迭代器:扮演容器與演算法之間的膠合劑,是所謂的泛型指標 4.放函式: 行為類似函式 5.配接器: 一種用來修飾容器或仿函式或迭代器介面的東西 6.配置器: 負責空間配置與管理
1.4 GNU open source
1.GPL詳細內容1
2.open source詳情內容2
3.不同時期STL的版本3:
-
HP-STL:第一個STL的實現版本
-
P.J.Plauger STL:屬於個人作品,由P.J.Plauger本人實現,是HP STL的一個繼承版本
-
Rouge Wave STL:由Rouge Wave公司實現,也是HP STL的繼承版本,被C++ Builder使用
-
STLport:主要把SGI STL的基本版本移植到VC++和C++ Builder上
-
SGI STL:在GCC採用,在linux上效能出色且開源(在http://www.sgi.com可下載原始碼)
-
STL家族圖譜如下:
2. 組態設定
2.1 環境組態設定
- ==<stl_config.h>==標頭檔案
- 適配不同編譯器下的編譯環境
- 如果編譯器不提供本STL的一些功能,則定義_STL_NEED_XXX
2.2 部分組態測試
1.組態3: __STL_STATIC_TEMPLATE_MEMBER_BUG //測試編譯器是否支援靜態資料成員 //編譯器:g++ 4.4.7 //編譯環境: Ubuntu 12.04 LTS \n \l
include <iostream>
using namespace std;
template <typename T>
class testClass {
public:
static int _data;
};
template<>
int testClass<int>::_data = 1;
template<>
int testClass<char>::_data = 2;
int main()
{
cout << testClass<int>::_data << endl;
cout << testClass<char>::_data << endl;
testClass<int> obji1, obji2;
testClass<char> objc1,objc2;
cout << obji1._data << endl;
cout << obji2._data << endl;
cout << objc1._data << endl;
cout << objc2._data << endl;
obji1._data = 3;
objc2._data = 4;
cout << obji1._data << endl;
cout << obji2._data << endl;
cout << objc1._data << endl;
cout << objc2._data << endl;
return 0;
}
執行結果: 2.組態5: __STL_CLASS_PARTIAL_SPECIALIZATION //測試編譯器是是否支援區域性特殊化的類模板 //編譯器:g++ 4.4.7 //編譯環境: Ubuntu 12.04 LTS \n \l
#include<iostream>
using namespace std;
template <class I,class O>
struct testClass
{
testClass() {cout<<"I,O"<<endl;}
};
//對類實現偏特化
template <class T>
struct testClass<T*,T*>
{
testClass() {cout<<"T*,T*"<<endl;}
};
//對類實現偏特化
template<class T>
struct testClass<const T*,T*>
{
testClass(){ cout<<"const T*,T*"<<endl;}
};
int main()
{
testClass<int,char> obj1;
testClass<int*,int*> obj2;
testClass<const int*,int*> obj3;
}
執行結果:
3.還有一些其他的組態,大家可以自行測試! 分享生活的每一天!fighting!!!