STL源码剖析(一)

欢迎大家来访二笙的小房子,一同学习分享生活!

文章目录

  • 写在前面
  • 1.了解STL
    • 1.1 STL概述
    • 1.2 STL的历史
    • 1.3 STL六大组件
    • 1.4 GNU open source
  • 2. 组态设置
    • 2.1 环境组态设置
    • 2.2 部分组态测试

写在前面

学习STL,了解STL的历史与发展,深度剖析STL源码,提高自己的编程能力!!!

1.了解STL

1.1 STL概述

  • STL诞生:为了建立数据结构和算法的一套标准,并且降低其间的耦合关系以提升各自的独立性、弹性、交互操作性,从而诞生了STL
  • STL的价值:
    1.STL带给我们一套极具实用价值的零部件,以及一个整合的组织
    2.还带给我们一个高层次、以泛型思维为基础的、系统化的、条理分明的软件组件分类学
  • STL所实现的,是依据泛型思维架设起来的一个概念结构

1.2 STL的历史

关于STL的历史(一) — 引自Morning主页 | 学步园

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家族图谱如下:

STL源码剖析(一)_第1张图片

2. 组态设置

2.1 环境组态设置

  • ====头文件
  • 适配不同编译器下的编译环境
  • 如果编译器不提供本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;
}

运行结果:
STL源码剖析(一)_第2张图片
2.组态5: __STL_CLASS_PARTIAL_SPECIALIZATION
//测试编译器是是否支持局部特殊化的类模板
//编译器:g++ 4.4.7
//编译环境: Ubuntu 12.04 LTS \n \l

#include
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;
}

运行结果:
STL源码剖析(一)_第3张图片

3.还有一些其他的组态,大家可以自行测试!
分享生活的每一天!fighting!!!


  1. 详情可见GPL ↩︎

  2. 详情可见open source ↩︎

  3. 引用自tongdh的博客 ↩︎

你可能感兴趣的:(【STL源码剖析】,STL源码剖析)