1. 程式人生 > >STL原始碼剖析(一)

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!!!