美文网首页
动态数组

动态数组

作者: lieon | 来源:发表于2021-01-04 16:04 被阅读0次
  • 关注点:
    • 动态数组的扩容处理
    • 内存管理处理
  • 缺点:
    • 可能会造成大量的内存浪费

template<class Item>
class ArrayList {
    
private:
    int m_size = 0;
    int m_capacity = 0;
    Item *m_elements { nullptr };
    
    // 扩容
    void ensureCapacity(int capacity) {
        int oldCap = m_size;
        if (oldCap >= capacity) {
            return;
        }
        int newCap = oldCap + (oldCap >> 1);
        Item *newElements = new Item[newCap];
        for (int index = 0; index < m_size; index++) {
            newElements[index] = m_elements[index];
        }
        m_capacity = newCap;
        m_elements = newElements;
        cout << "容量为:" << oldCap << "扩容为: " << m_capacity << endl;
    }
    
    // 缩容
    void trim() {
        if (m_size == 0) {
            return;
        }
        int oldCap = m_capacity;
        int newCap = oldCap >> 1;
        if (m_size >= newCap || oldCap <= 10) {
            return;
        }
        Item *newElements = new Item[newCap];
        for (int i = 0; i < m_size; i++) {
            newElements[i] = m_elements[i];
        }
        m_capacity = newCap;
        m_elements = newElements;
        cout << "容量为:" << oldCap << "缩容为: " << m_capacity << endl;
    }
public:
    ArrayList(int capacity = 100) {
        ensureCapacity(capacity);
    }
    
    ~ArrayList() {
        delete[] m_elements;
        m_elements = nullptr;
    }
    
    void clear() {
        delete[] m_elements;
        m_size = 0;
    }
    
    int getSize() {
        return m_size;
    }
    
    bool contains(Item element) {
        return indexOf(element) != -1;
    }
    
    void add(Item element) {
        insert(m_size, element);
    }
    
    void insert(int index, Item element) {
        if (index < 0 || index > m_size) {
            throw "Out of bounds, index:" + std::string("%ld", index);
        }
        ensureCapacity(m_size + 1);
        for (int i = m_size - 1; i > index; i--) {
            m_elements[i + 1] = m_elements[i];
        }
        m_elements[index] = element;
        m_size++;
    }
    
    Item get(int index) {
        if (index > m_size) {
            throw "Out of bounds";
        }
        return m_elements[index];
    }
    
    int indexOf(Item element) {
        for (int i = 0; i < m_size; i++) {
            if (element == m_elements[i]) {
                return i;
            }
        }
        return -1;
    }
    
    int removeAt(int index) {
        if (index < 0 || index >= m_size) {
            throw "Out of bounds";
        }
        int old = get(index);
        for (int i = index + 1; i < m_size; i++) {
            m_elements[i - 1] = m_elements[i];
        }
        m_elements[--m_size] = NULL;
        trim();
        return old;
    }
};

相关文章

  • 20_总结

    一、动态数组 普通动态数组 环形动态数组 接口设计 int size(){} // 元素的数量 boolean i...

  • C语言动态数组

    一维动态数组 二维动态数组

  • C语言 泛型动态数组

    泛型实现思路:万能指针void *动态数组实现思路:动态进行数组内存的扩容 realloc 泛型动态数组 数组可以...

  • C++ 动态顺序表的实现(更新中)

    动态数组与数组相似,但是动态数组的大小可以在运行时动态修改。动态数组的元素占用连续的内存块,一旦创建,就无法更改其...

  • 笨办法学C 练习34:动态数组

    练习34:动态数组 原文:Exercise 34: Dynamic Array 译者:飞龙 动态数组是自增长的数组...

  • VBA之数组

    数组的声明 一维数组 二维数组 动态数组

  • 数据结构大纲

    1、线性表 1.1、数组 1.1.1、简介 数组是一段连续的内存 1.1.2、动态数组 有动态扩容功能和动态缩容功...

  • 关于ArrayList

    ArrayList简介 ArrayList内部是以动态数组存放数据的,所谓动态数组,不是数组本身可以改变长度,而是...

  • 2018-11-28

    vector容器。 vector类称为向量类,实现了动态数组,用于元素数组动态变化的对象数组。同数组一样,vect...

  • C++ 创建动态二维数组

    有时候数组过大,栈放不下,可以利用动态分配生成动态数组 动态创建数组时一定要记得结束程序时释放内存。

网友评论

      本文标题:动态数组

      本文链接:https://www.haomeiwen.com/subject/fhyvoktx.html