STL相关基础

 前言

STL(Standard Template Library)是C++的标准模板库

 一、STL六大部件

  1. 容器(containers):由个各种数据结构组成,包括vector,list,deque,set,map等,用来存放数据。从实现角度来讲,STL容器是一种class template;

  2. 算法(algorithms):由各种算法组成,包括sort,search,copy,erase等,从实现角度来讲,STL算法适合一种function template;

  3. 迭代器(iterators):是链接容器和算法的桥梁,是一种“泛化指针”。从实现角度来讲,迭代器是一种讲operator*,operator->,operator++,operator--等相关操作重载的class template;

  4. 仿函数(functors):是一种行为像函数的类,一般作为算法的某种策略。从实现的角度来讲,仿函数是一种重载了operator()的class template;

  5. 适配器(adapters):一种用来修饰仿函数或容器或迭代器接口的东西,如STL中的queue和stack,虽然是容器,其实内部都是调用deque来实现的,是一种适配器;

  6. 分配器(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操作都包含两个阶段的操作:

  1. new:编译器会先调用::operator new分配内存;然后调用Obj::Obj()构造对象内容;
  2. 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

关系型容器与序列型容器

STL空间分配器源码详解

走进STL空间分配器

 

 

未完,待续。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值