我想创建一个特定对象的动态数组,它也支持向数组中添加新对象。
我正在努力解决这个问题,作为我课程练习的一部分。在本练习中,我们不应该使用std::vector
。
例如,假设我有一个名为Product
的类并声明一个指针:
Products* products;
然后我想支持以下内容:
products = new Product();
/* code here... */
products[1] = new Product(); // and so on...
我知道当前语法可能会导致访问冲突。我事先并不知道数组的大小,因为它可以在整个程序中改变。
问题是:
如何在没有矢量的情况下编写它?
我是否必须使用双指针(二维)?
每次我想添加新对象时,是否必须将数组复制到新数组(大小为+1),然后删除数组?
答案 0 :(得分:5)
std::vector
,则不应该写这个。如果由于某种原因需要,那么每次调整大小的复制是最简单的选择。std::vector
,这是迄今为止最简单的方法。其他一切都将(部分)重新发明一个标准库容器或另一个,这很难。答案 1 :(得分:0)
您必须使用自己的记忆管理,即更具体地说是其他(相关)问题:
不,如果你有一个连续分配的内存块,你的数据就在这里。
答案 2 :(得分:0)
我看到有些人已经回答了您的具体问题,所以我会回答更一般的答案。
你必须自己实现一种方法,但是你可以使用很多抽象数据类型,据我所知,最简单的是链表,如下所示:
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变量并从那里开始。 当然,这里的大多数功能都应该以其他方式实现,它被快速编码,因此您可以看到此任务所需的基础知识。
这是一种方式。 你也可以make your own data type。 或者使用其他一些数据类型来抽象数据。
答案 3 :(得分:0)
我认为"产品*产品;"你是说"产品"是一个类似矢量的容器。
1) How can I write it without vectors?
作为链表。实例化"产品"会给你一个空的链表。 覆盖operator []将插入/替换列表中的元素。因此,您需要扫描列表以找到正确的位置。如果在你找到合适的位置之前缺少几个元素,你可能需要附加那些"中性"元素之前的元素。这样做,通过"产品*产品"如果您计划覆盖operator []以处理元素的添加,则不可行,除非您声明"产品"而是
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))时间重新分配,只需增加两倍的数组大小(并且假设你有一个零终端或嵌入的计数)。或者只是使用链接列表来避免在添加元素之前对所有元素进行任何复制。
答案 4 :(得分:0)
你可能应该做的事情(也就是我相信你应该做的事情)是编写你自己的代表动态数组的类(即你要重新发明std::vector
的部分内容。 )
尽管这里有很多人说,这是一项值得做的练习,应该是正常的计算机科学课程的一部分。
Product*
数组,那么您将以某种方式存储Product**
,所以是的。没有必要使用"双指针"但是,对于功能本身而言。vector
为提高时间复杂度所做的工作
扩展每个元素是一个很好的开始,然后你可以随时改变你的策略
(先按照简单的方式工作,如果需要,可以使用。)最简单的方法是首先实现int
(或其他一些基本数字类型)的数组,并确保它有效,然后更改内容的类型。