gpt4 book ai didi

使用动态数组的 C++ 逻辑错误

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:11 24 4
gpt4 key购买 nike

insert 函数中,我对数组ditemstempItems 使用动态内存分配。

我在哪里使用 tempItems 作为一个数组,是 ditems 的两倍大,并且还临时存储 ditems 中的所有项目;然后删除并分配 ditems 等于 tempItems

代码符合要求,但是当使用需要 ditems 存储 2000 个元素的足够数据对其进行测试时,ditems 数组似乎没有变大。但是如果我要在构造函数中设置 (arrayCap=2001;),那么就没有问题。

我是动态数组的新手,看了其他使用动态数组的代码,看起来我没有犯任何错误。我不能为这个任务使用 vector ,所以我被动态数组困住了,但我不确定这里出了什么问题。

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;

};

最佳答案

将数组移动到新位置会使迭代器 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;
};

关于使用动态数组的 C++ 逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52332981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com