STL源码剖析(一)

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

写在前面

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

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


  1. 详情可见GPL ↩︎

  2. 详情可见open source ↩︎

  3. 引用自tongdh的博客 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值