- 一、自己根据逻辑实现的容器
- 二、存在的问题
- 三、解决办法
- 四、空间配置器的实现
一、自己根据逻辑实现的容器
templateclass SeqStack { public: SeqStack(int size = 10) : _size(size), _top(-1) { _pstack = new T[size]; } SeqStack(const SeqStack &st) { _size = st._size; _top = st._top; for (int i = 0; i < _top; i++) { _pstack[i] = st._pstack[i]; } } SeqStack &operator=(const T &st) { if (&st == this) { return *this; } delete[] _pstack; _size = st._size; _top = st._top; for (int i = 0; i <= _top; i++) { _pstack[i] = st._pstack[i]; } return *this; } ~SeqStack() { delete[]_pstack; } bool empty() { return -1 == _top; } bool full() { return _top + 1 == _size; } void push(const T &ele) { if (full()) { _resize(); } _pstack[++_top] = ele; } void pop() { if (empty()) { throw "empty stack"; } _top--; } T &top() { if (empty()) { throw "empty stack"; } return _pstack[_top]; } void show() { if (empty()) { return; } for (int i = 0; i <= _top; i++) { cout << _pstack[i] << " "; } cout << endl; } private: T *_pstack; int _size; int _top; void _resize() { T *pstm = new T[_size * 2]; for (int i = 0; i <= _top; i++) { pstm[i] = _pstack[i]; } delete[] _pstack; _pstack = pstm; _size = _size * 2; }; }; int main() { SeqStack st = SeqStack (); for (int i = 1; i < 20; i++) { st.push(i); st.show(); } system("pause"); return 0; };
二、存在的问题
- 创建容器对象的时候,在容器的构造器中,容器空间是new出来的,而new做了两件事情,一是开辟空间,而是初始化对象,即容器构造完成后,容器并不是一个空容器,而是一个放满了对象的容器,这并不符合逻辑;
- pop的时候只是将top指针进行移动,而未真正的将容器中的元素移除。
容器的空间配置器就是为了解决此问题出现的,allocator并不使用new,而是使用malloc申请内存空间,这样就做到了只分配空间而不创建对象的目的,在向容器中放置对象的时候使用定位new在特定的位置上创建对象。在pop的时候,移动指针的时候也会调用析构函数资源释放。
空间配置器一般提供四个方法:
- 内存开辟,alloccate() ;
- 在指定的位置构造对象,construct();
- 释放对象资源(调用对象析构函数),destroy();
- 回收空间, deallcate() ;



