前言
STL(Standard Template Library)是C++的标准模板库
一、STL六大部件
-
容器(containers):由个各种数据结构组成,包括vector,list,deque,set,map等,用来存放数据。从实现角度来讲,STL容器是一种class template;
-
算法(algorithms):由各种算法组成,包括sort,search,copy,erase等,从实现角度来讲,STL算法适合一种function template;
-
迭代器(iterators):是链接容器和算法的桥梁,是一种“泛化指针”。从实现角度来讲,迭代器是一种讲operator*,operator->,operator++,operator--等相关操作重载的class template;
-
仿函数(functors):是一种行为像函数的类,一般作为算法的某种策略。从实现的角度来讲,仿函数是一种重载了operator()的class template;
-
适配器(adapters):一种用来修饰仿函数或容器或迭代器接口的东西,如STL中的queue和stack,虽然是容器,其实内部都是调用deque来实现的,是一种适配器;
-
分配器(allocator):负责空间配置与管理,从实现的角度来讲,分配器是一个实现动态空间配置、管理、释放的class template;包括容器分类器,迭代器分类器,仿函数分配器;
二、空间分配器
空间分配器是STL最底层的东西,我们使用时默认都是调用封装好的接口;
SGI STL专属空间分配器(alloc),与STL分配器(allocator)标准规范由不同;
SGI STL的每个容器都已经指定缺省的空间分配器是alloc
template <class T,class Alloc = alloc> //预设使用alloc分配器
class vector{···};
在C++中,当我们调用new和delete进行对象创建和销毁时,同时也会由内存分配操作和释放操作:
class test{···};
test *pf = new test; //分配内存,然后构造对象
···
delete pf; //析构对象,然后释放内存
new和delete操作都包含两个阶段的操作:
- new:编译器会先调用::operator new分配内存;然后调用Obj::Obj()构造对象内容;
- delete:编译器会先调用Obj::~Obj()析构对象;然后调用::operator delete释放空间;
STL allocator讲这两个阶段操作区分开:
- 对象构造由::construct()负责;对象释放由::destroy()负责;
- 内存分配由alloc::allocate()负责;内存释放由alloc::deallocate()负责;
STL分配器定义在<memory>中,如下图所示
construst()和destroy()源码
//以下是construct()函数
#include <new.h>
template <typename T1,typename t2>
inline void construct(T1 *p,const T2& value)
{
new (p) T1(value); //调用T1::T1(value)
}
//以下是destroy()函数第一版本
template <typename T> //第一版本,接受一个指针
inline void destroy(T *pointer)
{
pointer->~T(); //调用 dtor ~T()
}
//以下是destroy()函数第二版本,接受两个迭代器
template <typename ForwardIterator>
inline void destory(ForwardIterator first,ForwardIterator last)
{
__destory(first,last,value_type(first));
}
//判断元素的数值型别(value type)是否重要(trivial destructor)
template <typename ForwardIterator,typename T>
inline void __destroy(ForwardIterator first,ForwardIterator last,T*)
{
typedef typename __type_traits<T>::has_trivial_destructor trivial_destructor;//注1
__destroy_aux(first,last,trivial_destructor());
}
//如果是重要的(non-trivial destructor)的
template <typename ForwardIterator,typename T>
inline void __destroy_aux(ForwardIterator first,ForwardIterator last,__false_type)
{
for(;first<last;++first)
{
destroy(&*first);
}
}
//如果是trivial destructor,则no-op
template <typename ForwardIterator,typename T>
inline void __destroy_aux(ForwardIterator first,ForwardIterator last,__true_type){}
c++Application
c++Library(std::allocator)
c++promitives(new,new[],new(),::operator new(),...)
CRT(malloc/free)
O.S.API
关系型容器与序列型容器
未完,待续。。。