本文主要是介绍从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下:
1 2 | template < class _Ty, class _Ax = allocator<_Ty> > class vector; |
但在VC2008 中vector 还有基类,如下:
1 2 3 4 5 6 7 | // TEMPLATE CLASS vector template < class _Ty, class _Ax > class vector : public _Vector_val<_Ty, _Ax> { }; |
稍微来看一下基类_Vector_val:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // TEMPLATE CLASS _Vector_val template < class _Ty, class _Alloc > class _Vector_val : public _CONTAINER_BASE_AUX_ALLOC<_Alloc> { // base class for vector to hold allocator _Alval protected: _Vector_val(_Alloc _Al = _Alloc()) : _CONTAINER_BASE_AUX_ALLOC<_Alloc>(_Al), _Alval(_Al) { // construct allocator from _Al } typedef typename _Alloc:: template rebind<_Ty>::other _Alty; _Alty _Alval; // allocator object for values }; |
为了理解_Alty 的类型,还得看一下allocator模板类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | template< class _Ty> class allocator { template<> class _CRTIMP2_PURE allocator< void> { // generic allocator for type void public: template< class _Other> struct rebind { // convert an allocator<void> to an allocator <_Other> typedef allocator<_Other> other; }; .... }; ... }; |
typedef typename _Alloc::template rebind<_Ty>::other _Alty; 整体来看是类型定义,假设现在我们这样使用
vector<int>, 那么_Ty 即 int, _Ax 即 allocator<int>,由vector 类传递给 基类_Vector_val,则_Alloc 即
allocator<int> ;可以看到 allocator<void> 是allocator 模板类的特化, rebind<_Ty> 是成员模板类,other是成员模板类
中自定义类型,_Ty 即是int , 那么other 类型也就是allocator<int>, 也就是说_Alty 是类型 allocator<int> 。
_Alty _Alval; 即 基类定义了一个allocator<int> 类型的成员,被vector 继承后以后用于为vector 里面元素分配内存等操作。
如 iterator new_data = alloc.allocate(new_size); 注意,标准的vector::iterator 是以模板类实现的,下面的实现简单地将其等同为指
针,实际上真正的iterator 类的实现是内部有一个指针成员,指向容器元素。
这篇关于从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!