gpt4 book ai didi

c++ - push_back 和 insert 在我自己的 vector 类中不能正常工作

转载 作者:行者123 更新时间:2023-11-30 03:13:38 31 4
gpt4 key购买 nike

所以,这是我以简单方式实现自己的 vector 类的头文件。问题是即使代码编译通过,成员函数 pushBack 和 insert 都不能正常工作。

如果有人能找出我代码中的问题或找到解决此问题的方法,我将非常高兴。

#include <iostream>
#include <new>
using namespace std;

template <typename T>
class DiyVector
{
public:
DiyVector()
{
arr = new T[1];
arrSize = 0;
index = 0;
capacity = 1;
}
~DiyVector()
{
delete[] arr;
}

T& at(unsigned int index) const
{
if (index >= arrSize || index < 0)
{
throw OutOfRange{};
}
else
{
return arr[index];
}
}

unsigned int size() const
{
return arrSize;
}

void pushBack(const T& item)
{
if (arrSize == capacity)
{
arrTemp = new T[capacity += 1];

for (unsigned int i = 0; i < capacity; ++i)
{
arrTemp[i] = arr[i];
}

delete[] arr;
capacity++;
arr = arrTemp;
}

arr[arrSize] = item;
arrSize++;

}

void popBack()
{
if (arrSize == 0)
{
throw OutOfRange{};
}
else
{
arrSize--;
}
}

void erase(unsigned int index)
{
if (index >= arrSize || index < 0)
{
throw OutOfRange{};
}

else
{
arrTemp = new T[capacity -= 1];

for (unsigned int i = 0; i < capacity; ++i)
{
arrTemp[i] = arr[i];
}

delete[] arr;
capacity--;
arr = arrTemp;
}
}

void insert(unsigned int index, const T& item)
{
if (index >= arrSize || index < 0)
{
throw OutOfRange{};
}

else if (index == capacity)
{
pushBack(item);
}
else if (0 <= index && index <= size())
{
arr[index] = item;
}
}

class OutOfRange{};

private:
unsigned int arrSize;
unsigned int capacity;
unsigned int index;
T* arr;
T* arrTemp;
};

最佳答案

对于初学者来说,检查一些成员函数(例如包括 insert)

if (index >= arrSize || index < 0)
^^^^^^^^^^

没有意义,因为声明为具有 unsigned int 类型的变量 index 永远不能为负。所以你可以排除 if 语句的第二个子条件。

在此循环中的函数pushBack

        for (unsigned int i = 0; i < capacity; ++i)
{
arrTemp[i] = arr[i];
}

capacity 替换为 arrSize

同时删除语句

capacity++;

因为capacity在这条语句中已经增加了

arrTemp = new T[capacity += 1];

在函数 insert 中更改此代码段

    else if (index == capacity)
{
pushBack(item);
}
else if (0 <= index && index <= size())
{
arr[index] = item;
}

    if ( arrSize <= index )
{
pushBack(item);
}
else
{
arr[index] = item;
}

你可以删除数据成员

unsigned int index;

因为没有用到。

注意成员函数erase也是不正确的。至少不需要重新分配阵列和改变它的容量。容量又减少了两次。

     arrTemp = new T[capacity -= 1];
//...
capacity--;

即该函数与pushBack函数有同样的缺陷。在循环中,您正在处理已删除的元素。

关于c++ - push_back 和 insert 在我自己的 vector 类中不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58521432/

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