在插入函数中,我对数组 ditems 和 tempItems 使用动态内存分配。
我在使用 tempItems 作为数组的大小是 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;
};
答案 0 :(得分:2)
将数组移到新位置会使迭代器position
无效,它指向旧数组。因此i>position
是未定义的行为。
您应该在移动数组之前计算索引,并在新数组的索引处设置position
。
template <class T>
class Vector {
public:
typedef T* iterator;
Vector () {
arrayCap=1000;
ditems = new T[arrayCap];
used = 0;
}
T& operator[](unsigned int i) {
return ditems[i];
}
iterator begin () {
return ditems;
}
iterator end () {
return &ditems[used];
}
int size () { return used; }
void deletes(){
used--;
}
iterator insert (iterator position, const T& item) {
if(arrayCap-used<100)
{
auto temp=arrayCap;
arrayCap*=2;
auto index = position - ditems;
auto tempItems=new T[arrayCap];
for(int i=0; i<temp;i++)
{
tempItems[i]= ditems[i];
}
delete [] ditems;
ditems = tempItems;
position = ditems + index;
}
for(Vector<T>::iterator i=&ditems[arrayCap-1]; i>position; i--)
{
*i=*(i-1);
}
used++;
*position = item;
return position;
}
private:
int arrayCap;
T *ditems;
int used;
};