【发布时间】:2018-09-14 13:23:18
【问题描述】:
在 insert 函数中,我对数组 ditems 和 tempItems 使用动态内存分配。
我使用 tempItems 作为一个数组,是 ditems 的两倍,并且还临时存储 ditems 中的所有项目;然后删除并分配 ditems 等于 tempItems
代码符合要求,但是当使用足够的数据进行测试时,需要 ditems 来存储 2000 个元素,似乎 ditems 数组并没有变得更大。但是如果我在构造函数中设置(arrayCap=2001;),那么没有问题。
我不熟悉使用动态数组并使用动态数组查看其他代码,看起来我没有犯任何错误。我不能在这个任务中使用向量,所以我被动态数组困住了,但我不确定这里出了什么问题。
template <class T>
class Vector {
public:
typedef T* iterator;
Vector () {
arrayCap=1000;
ditems = new T[arrayCap];
}
T& operator[](unsigned int i) {
return ditems[i];
}
iterator begin () {
used=0;
return &ditems[used];
}
iterator end () {
return &ditems[used];
}
int size () { return used; }
void deletes(){
used--;
}
iterator insert (iterator position, const T& item) {
if(arrayCap-used<100)
{
temp=arrayCap;
arrayCap=2*arrayCap;
tempItems=new T[arrayCap];
for(int i=0; i<temp;i++)
{
tempItems[i]= ditems[i];
}
delete [] ditems;
ditems=tempItems;
}
for(Vector<T>::iterator i=&ditems[arrayCap-1]; i>position; i--)
{
*i=*(i-1);
}
used++;
*position= item;
return position;
}
private:
int arrayCap,temp;
T *ditems;
T *tempItems;
int used;
};
【问题讨论】:
-
您的
begin()和end()返回相同的内容。您的范围将始终显示为空。 -
tempItems应该是insert方法中的局部变量。没有理由将其设为类变量。temp变量也是如此。 -
used变量的使用不正确,应该在构造函数中设置,而不是在begin方法中设置。begin方法应该是return &ditems[0]; -
@FrançoisAndrieux 不是在这种情况下,在我的代码的其他部分未包括在这里,我只调用一次 begin() 每次创建一个对象,所以当我将更多元素插入到ditems中时使用会增加。
-
@StackUser 当您调用
begin方法时,您将used设置为零。换句话说,调用 begin 会将向量的大小设置为零。显然这是一个错误。