C++ push_back和insert在我自己的vector类中不能正常工作
这里是头文件,我用一种简单的方式实现了自己的向量类。 问题是,即使代码编译,成员函数pushBack和insert也不能正常工作 如果有人能在我的代码中找出问题,或者找到解决问题的方法,我会非常高兴C++ push_back和insert在我自己的vector类中不能正常工作,c++,arrays,templates,vector,C++,Arrays,Templates,Vector,这里是头文件,我用一种简单的方式实现了自己的向量类。 问题是,即使代码编译,成员函数pushBack和insert也不能正常工作 如果有人能在我的代码中找出问题,或者找到解决问题的方法,我会非常高兴 #include <iostream> #include <new> using namespace std; template <typename T> class DiyVector { public: DiyVector() {
#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;
};
#包括
#包括
使用名称空间std;
模板
类DiyVector
{
公众:
DiyVector()
{
arr=新的T[1];
arrSize=0;
指数=0;
容量=1;
}
~DiyVector()
{
删除[]arr;
}
T&at(无符号整数索引)常量
{
如果(索引>=arrSize | |索引<0)
{
抛出范围{};
}
其他的
{
返回arr[索引];
}
}
无符号整数大小()常量
{
返回值大小;
}
无效回推(常数T和项目)
{
如果(arrSize==容量)
{
ARRTTEMP=新T[容量+=1];
for(无符号整数i=0;i=arrSize | |索引<0)
{
抛出范围{};
}
其他的
{
ARRTTEMP=新T[容量-=1];
for(无符号整数i=0;i=arrSize | |索引<0)
{
抛出范围{};
}
else if(索引==容量)
{
推回(项目);
}
else if(0首先检查一些成员函数(例如,包括插入
)
对于arrSize
的subritute容量
同时删除该语句
capacity++;
arrTemp = new T[capacity += 1];
因为此语句中的容量已增加
capacity++;
arrTemp = new T[capacity += 1];
在函数insert
中更改此代码段
else if (index == capacity)
{
pushBack(item);
}
else if (0 <= index && index <= size())
{
arr[index] = item;
}
因为它没有被使用
请注意,成员函数erase也不正确。至少不需要重新分配阵列并更改其容量。并且容量会减少两倍
arrTemp = new T[capacity -= 1];
//...
capacity--;
也就是说,该函数与函数push-back具有相同的缺陷。在循环中,您处理的是被擦除的元素。您的意思是capacity+=1;
而不是capacity+1;
中的push-back
?@debrisoroidscapacity+1
不做任何事情,因为您没有给任何东西赋值。因此您必须vecapacity=capacity+1
或简而言之capacity+=1
index
从未在构造函数中初始化,因此使用它将成为未定义的行为。显示的代码中有多个基本错误;而且可能还有其他错误,完整的分析将发现。您需要学习如何使用调试器,因此您可以n调试自己的代码并查看它的所有错误。StaskOffFoo.com不是真正的调试器的替代者。这是调试器所需要的。知道如何使用调试器是每个C++开发者所需的技能。您是否使用过这个代码的调试器,如果没有,为什么不?为什么“<代码>(索引>=arrSize | |索引<0)
”几乎在每个方法中都会出现,甚至在这个方法中,它完全没有意义?这看起来像是机器人复制到每个方法中的东西,没有完全理解它的必要性;然后,为了消除编译错误,索引作为类成员被添加;但没有完全理解编译的原因编译错误。当你看到一个你不理解的编译错误时,正确的做法是找出它,而不是在互联网上搜索,并假设第一个解释适用于这里。@Debrisooids好的,这是有意义的(虽然我不喜欢这样的任务,它基本上迫使您实现一个非常糟糕的vector版本)。无论如何,请注意,索引
不能是。我要补充一点,这个基于OP代码的解决方案可能会在每次回推
时增加容量,这将是非常低效的。例如,最好将容量翻一番。@DanielLangr我更新了相对于冗余数据成员索引的post。但是对于insert成员函数,如果(index>=arrSize)@debisoroids但index
指的是insert
的参数,而不是index
成员变量,我抛出的是OutOfRange错误。@debisoroids但在任何情况下,函数擦除中的容量都不能减少两倍。
unsigned int index;
arrTemp = new T[capacity -= 1];
//...
capacity--;