[英]Create dynamic array of objects
我想創建一個特定對象的動態數組 ,該數組還支持向該數組添加新對象。
在我的課程中,我正在嘗試解決此問題。 在本練習中,我們不應該使用std::vector
。
例如,假設我有一個名為Product
的類並聲明了一個指針:
Products* products;
那么我要支持以下內容:
products = new Product();
/* code here... */
products[1] = new Product(); // and so on...
我知道當前語法可能會導致訪問沖突。 我不知道數組的大小,因為它可以在整個程序中更改。
問題是:
沒有向量我怎么寫呢?
我是否必須使用雙指針(二維)?
每次我想添加一個新對象時,是否都必須將數組復制到新數組(大小為+1),然后刪除該數組?
std::vector
不應編寫此代碼。 如果您出於某種原因需要,則每次調整大小都是最簡單的選擇。 std::vector
,這是迄今為止最簡單的方法。 其他一切(部分)將是重塑一個標准庫容器或另一個,這很困難。 您必須使用自己的內存內存管理,即更具體地講其他(相關)問題:
否,如果您有一個連續分配的內存塊用於存放數據。
我看到人們已經回答了您的特定問題,所以我會回答一個更籠統的答案。
您必須自己實現一種方法,但是據我所知,最簡單的方法是鏈接列表,可以使用很多抽象數據類型,例如:
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
某些部分)。
盡管周圍有很多人在說,這是一個值得的練習,應該成為普通計算機科學課程的一部分。
Product*
數組,則將存儲Product**
,所以可以,以某種方式。 但是,功能本身不必具有“雙指針”。 vector
就是這樣做的,以改善其時間復雜度。 首先實現一個int
數組(或其他一些基本的數字類型)並確保其有效,然后更改內容的類型,這可能是最容易的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.