【问题标题】:Dynamic Array implementation in C++C++ 中的动态数组实现
【发布时间】:2021-08-28 08:59:30
【问题描述】:

我正在尝试使用 C++ 实现动态数组。但是,我的resize() 功能似乎无法正常工作。没有错误或警告。我做了一些研究并试图查看在互联网上找到的其他实现,但无法解决这个问题。我把我的代码放在下面。

#include <iostream>

class Array
{
private:
    int* arr;
    int size = 0;
    int capacity = 1;

public:
    Array() { arr = new int[capacity]; }

    Array(int capacity)
        :
        capacity(capacity)
    {
        arr = new int[capacity];
    }

    int length() const { return size; }

    bool is_empty() const { return (length() == 0); }

    int get(int index) const { return arr[index]; }

    void set(int index, int value) { arr[index] = value; }

    void resize()
    {
        capacity *= 2;
        int* temp = new int[capacity];
        for (int i = 0; i < size; i++) { temp[i] = arr[i]; }
        delete[] arr;
        arr = temp;
        for (int i = 0; i < capacity; i++) { arr[i] = 0; }
    }

    void add(int value)
    {
        if (size + 1 >= capacity) { resize(); }
        arr[size++] = value;
    }

    void remove(int index)
    {
        for (int i = index; i < size - 1; i++)
        {
            arr[i] = arr[i + 1];
        }
        size--;
    }

    int& operator[](int index)
    {
        return arr[index];
    }
};

int main()
{
    Array array;

    for (int i = 0; i < 5; i++)
    {
        array.add(i + 1);
    }

    for (int i = 0; i < array.length(); i++)
    {
        std::cout << array.get(i) << " ";
    }
    std::cout << '\t' << array.length() << '\n';

    return 0;
}

代码输出:

0 0 0 4 5   5

但我希望它会输出:

1 2 3 4 5   5

【问题讨论】:

  • 为什么要将分配的容量归零超过size?只需让它保持未初始化状态,并在 get 方法中编写检查,以确保它们在被写入之前永远不会被读取。

标签: c++ class dynamic-memory-allocation definition member-functions


【解决方案1】:

在您的 resize 方法中,您从 arr 复制了现有元素

for (int i = 0; i < size; i++) { temp[i] = arr[i]; }

但是后来你0把所有的元素都去掉了,有效的清除了之前的数据

for (int i = 0; i < capacity; i++) { arr[i] = 0; }

相反,您可能只想0 尾随的新元素

for (int i = size; i < capacity; ++i) { arr[i] = 0; }

【讨论】:

    【解决方案2】:

    这个循环

    for (int i = 0; i < capacity; i++) { arr[i] = 0; }
    

    不正确。它将第一个 size 元素设置为 0。

    事实上这个循环是多余的。除了这个循环,你可以写在分配内存的语句中

    int* temp = new int[capacity]();
    

    函数add()的定义也不正确。它应该看起来像:

    void add(int value)
    {
        if (size == capacity) { resize(); }
        arr[size++] = value;
    }
    

    您需要明确定义析构函数。例如

    ~Array()
    {
        delete []arr;
    }
    

    您还需要明确定义复制构造函数和复制赋值运算符,或者将它们定义为已删除。例如

    Array( const Array & ) = delete;
    Array & operator =( const Array & ) = delete;
    

    否则使用这些成员函数会导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多