簡體   English   中英

創建對象的動態數組

[英]Create dynamic array of objects

我想創建一個特定對象的動態數組 ,該數組還支持向該數組添加新對象。

在我的課程中,我正在嘗試解決此問題。 在本練習中,我們不應該使用std::vector

例如,假設我有一個名為Product的類並聲明了一個指針:

Products* products;

那么我要支持以下內容:

products = new Product();

/* code here... */

products[1] = new Product(); // and so on...

我知道當前語法可能會導致訪問沖突。 我不知道數組的大小,因為它可以在整個程序中更改。

問題是:

  1. 沒有向量我怎么寫呢?

  2. 我是否必須使用雙指針(二維)?

  3. 每次我想添加一個新對象時,是否都必須將數組復制到新數組(大小為+1),然后刪除該數組?

  1. 如果沒有std::vector不應編寫此代碼。 如果您出於某種原因需要,則每次調整大小都是最簡單的選擇。
  2. 我看不出有什么幫助。 (即不)
  3. 如上所述,如果您不能使用std::vector ,這是迄今為止最簡單的方法。 其他一切(部分)將是重塑一個標准庫容器或另一個,這很困難。
  1. 您必須使用自己的內存內存管理,即更具體地講其他(相關)問題:

  2. 否,如果您有一個連續分配的內存塊用於存放數據。

  3. 是,如果2.是您所需的實現方法。 但是,如果您不想使用較大的內存塊,則必須使用(雙)鏈接列表,該列表不需要您每次都復制整個數組。

我看到人們已經回答了您的特定問題,所以我會回答一個更籠統的答案。

您必須自己實現一種方法,但是據我所知,最簡單的方法是鏈接列表,可以使用很多抽象數據類型,例如:

class ProductNode
{
    public:
        ProductNode() : _data(NULL), _next(NULL)
        {
        }
        void setProduct(Product* p); //setter for the product pointer
        {
            this->_data = p;
        }
        Product getProduct(); //getter for the product pointer
        {
            return *(this->_data);
        }
        void addNext(); //allocate memory for another ProductNode in '_next'
        {
            if(!next)
            {
                  this->_next = new ProductNode();
            }
        }
        ProductNode* getNext(); //get the allocated memory, the address that is in '_next'
        {
             return this->_next;
        }
        ~ProductNode(); //delete every single node from that node and forward, it'll be recursive for a linked list
    private:
        Product* _data;
        ProductNode* _next;
}

聲明一個head變量,然后從那里去。 當然,此處的大多數功能都應該以其他方式實現,因此已對其進行了快速編碼,因此您可以了解此分配所需的基礎知識。

那是一種方式。 您也可以創建自己的數據類型 或者使用其他一些數據類型來抽象數據。

我想用“產品*產品”; 您的意思是“產品”是類似矢量的容器。

1) How can I write it without vectors?

作為鏈接列表。 實例化“產品產品”將為您提供一個空的鏈表。 覆蓋operator []將在列表中插入/替換元素。 因此,您需要掃描列表以找到正確的位置。 如果缺少幾個元素直到找到正確的位置,則可能需要在元素之前附加那些“中性”元素。 這樣做,如果您打算重寫operator []來處理元素的添加,那么除非您聲明“ Products產品”,否則通過“ Product *產品”是不可行的

2) Do I have to use double pointers (2-dimension)?

這個問題缺乏精確性。 如“ typedef產品*產品;” 然后是“產品*產品”? 只要您在“產品”和“產品”之間保持“ *”,就沒有辦法覆蓋operator []來處理元素的添加。

3) Every time I want to add a new object, do I have to copy the array to the new array (with +1 size), and then delete the array?

如果您堅持使用數組,則可以通過簡單地將數組大小增加兩倍來使用O(log2(n))時間重新分配(並且假設您嵌入了零終端或計數)。 或者只是使用鏈接列表來避免在添加元素之前復制所有元素。

您可能應該做的(即我相信您應該做的)是編寫一個代表動態數組的類(即,您將重新發明std::vector某些部分)。
盡管周圍有很多人在說,這是一個值得的練習,應該成為普通計算機科學課程的一部分。

  1. 使用動態分配的數組,該數組是您的類的成員。
  2. 如果您使用的是動態分配的Product*數組,則將存儲Product** ,所以可以,以某種方式。 但是,功能本身不必具有“雙指針”。
  3. 從技術上講,沒有-您可以分配超出必要的空間,並且只有在空間不足時才能重新分配和復制。 vector就是這樣做的,以改善其時間復雜度。
    擴展每個元素是一個不錯的開始,而且您以后隨時可以更改策略。
    (首先獲得一種簡單的工作方式,如果需要的話,可以幻想一下。)

首先實現一個int數組(或其他一些基本的數字類型)並確保其有效,然后更改內容的類型,這可能是最容易的。

暫無
暫無

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

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