文章目录
allocators
低层都是调用malloc与free
内存池分配器
对于容器默认的分配器没有内存管理的概念,不过STL也提供了内存池的分配器
- 用例
vector<string,__gnu_cxx::__pool_alloc<string>>vec;
Iterator
- 以list迭代器为例,当容器执行相应的算法是需要知道迭代器的三个类型,分别是iterator_category,value_type,difference_type
template<class T,class Ref, class Ptr>
struct __list_iterator{
//根据迭代器是否支持+3,++等操作进行分类
typedef bidirectional_iterator_tag iterator_category;
//判断是那种数据类型的迭代器
typedef T value_type;
typedef Ptr pointer;
typedef Ref reference;
//迭代器与迭代器之间距离
typedef ptrdiff_t difference_type;
};
STL算法可以直接获得这些东西,但是如果传入的东西不是struct,比如原始指针,此时就需要萃取剂帮助STL算法来获取需要的值
template <class T>
//萃取器
struct iterator_traits{
typedef typename I::iterator_category iterator_category ;
typedef typename I::value_type value_type;
typedef typename I::difference_type difference_type;
typedef typename I::pointer pointer;
typedef typename I::reference reference;
};
//进行偏特化以便于判断一般指针
template <class T>
struct iterator_traits<T*>{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_f difference_type;
typedef T* pointer;
typedef T& reference;
};
template <class T>
struct iterator_traits<const T*>{
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_f difference_type;
typedef T* pointer;
typedef T& reference;
};