簡體   English   中英

C++ 中的動態數組實現

[英]Dynamic Array implementation in C++

我正在嘗試使用 C++ 實現動態數組。 但是,我的resize() function 似乎無法正常工作。 沒有錯誤或警告。 我做了一些研究並試圖查看在互聯網上找到的其他實現,但無法解決問題。 我把我的代碼放在下面。

#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

但我希望它是 output:

1 2 3 4 5   5

在您的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; }

這個循環

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

是不正確的。 它將第一個 size 元素設置為 0。

事實上,這個循環是多余的。 而不是這個循環,你可以寫在 memory 被分配的語句中

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

function add()的定義也不正確。 它應該看起來像:

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

您需要明確定義析構函數。 例如

~Array()
{
    delete []arr;
}

您還需要明確定義復制構造函數和復制賦值運算符或將它們定義為已刪除。 例如

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

否則,使用這些成員函數可能會導致未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM