栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++容器空间配置器allocator

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++容器空间配置器allocator

文章目录
  • 一、自己根据逻辑实现的容器
  • 二、存在的问题
  • 三、解决办法
  • 四、空间配置器的实现


一、自己根据逻辑实现的容器
template
class 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;
};

 

二、存在的问题
  1. 创建容器对象的时候,在容器的构造器中,容器空间是new出来的,而new做了两件事情,一是开辟空间,而是初始化对象,即容器构造完成后,容器并不是一个空容器,而是一个放满了对象的容器,这并不符合逻辑;
  2. pop的时候只是将top指针进行移动,而未真正的将容器中的元素移除。
     
三、解决办法

容器的空间配置器就是为了解决此问题出现的,allocator并不使用new,而是使用malloc申请内存空间,这样就做到了只分配空间而不创建对象的目的,在向容器中放置对象的时候使用定位new在特定的位置上创建对象。在pop的时候,移动指针的时候也会调用析构函数资源释放。
 

四、空间配置器的实现

空间配置器一般提供四个方法:

  1. 内存开辟,alloccate() ;
  2. 在指定的位置构造对象,construct();
  3. 释放对象资源(调用对象析构函数),destroy();
  4. 回收空间, deallcate() ;
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/864300.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号