添加到动态数组
Adding to dynamic array
免责声明:是的,我知道 std::vector。我这样做是为了学习。
我正在制作一个动态数组 class,我正在尝试让 add 开始工作。
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
它有效……有点。该函数在添加元素时有效,但程序在退出时崩溃。没有错误,什么都没有。它只是冻结,我必须使用 (Shift + F5) 关闭它。
那么,这有什么问题吗?
这是我的全部 class。如果我没有包含函数,则表示其中没有代码。
#ifndef ARRAY_H
#define ARRAY_H
using namespace std;
template <class T>
class Array
{
private:
T * mData;
int mCount;
public:
Array();
~Array();
void add(T value);
void insert(T value, int index);
bool isEmpty();
void display();
bool remove(T value);
bool removeAt(int index);
int size();
T & operator[](const int index);
};
// Constructors / Destructors
// --------------------------------------------------------
template <class T>
Array<T>::Array()
{
mCount = 0;
mData = new T[mCount];
for (int i = 0; i < mCount; i++)
mData[i] = 0;
}
template <class T>
Array<T>::~Array()
{
delete[] mData;
}
// General Operations
// --------------------------------------------------------
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
template <class T>
void Array<T>::display()
{
if (isEmpty())
{
cout
<< "The array is empty."
<< "\n\n";
return;
}
cout << "(";
for (int i = 0; i < mCount; i++)
{
cout << mData[i];
if (i < mCount - 1)
cout << ", ";
}
cout << ")" << "\n\n";
}
template <class T>
bool Array<T>::isEmpty()
{
return mCount == 0;
}
template <class T>
int Array<T>::size()
{
return mCount;
}
// Operator Overloads
// --------------------------------------------------------
template <class T>
T & Array<T>::operator[](const int index)
{
return mData[index];
}
#endif
如果您需要任何其他信息,请告诉我,我可以post。
假设 mCount
保持数组中元素的数量,那么当添加一个新元素时你真的必须至少分配 mCount + 1
个元素(当然假设你想保留所有旧元素一个和一个新的)来自:
T * tmp = new T[mCount + 1];
相对于:
T * tmp = new T[mCount];
如果不是出于教育目的,请改用std::vector
。例如,您的 add
函数不是异常安全的。
免责声明:是的,我知道 std::vector。我这样做是为了学习。
我正在制作一个动态数组 class,我正在尝试让 add 开始工作。
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
它有效……有点。该函数在添加元素时有效,但程序在退出时崩溃。没有错误,什么都没有。它只是冻结,我必须使用 (Shift + F5) 关闭它。
那么,这有什么问题吗?
这是我的全部 class。如果我没有包含函数,则表示其中没有代码。
#ifndef ARRAY_H
#define ARRAY_H
using namespace std;
template <class T>
class Array
{
private:
T * mData;
int mCount;
public:
Array();
~Array();
void add(T value);
void insert(T value, int index);
bool isEmpty();
void display();
bool remove(T value);
bool removeAt(int index);
int size();
T & operator[](const int index);
};
// Constructors / Destructors
// --------------------------------------------------------
template <class T>
Array<T>::Array()
{
mCount = 0;
mData = new T[mCount];
for (int i = 0; i < mCount; i++)
mData[i] = 0;
}
template <class T>
Array<T>::~Array()
{
delete[] mData;
}
// General Operations
// --------------------------------------------------------
template <class T>
void Array<T>::add(T value)
{
T * tmp = new T[mCount];
for (int i = 0; i < mCount; i++)
{
tmp[i] = mData[i];
}
mCount++;
delete[] mData;
mData = tmp;
mData[mCount - 1] = value;
}
template <class T>
void Array<T>::display()
{
if (isEmpty())
{
cout
<< "The array is empty."
<< "\n\n";
return;
}
cout << "(";
for (int i = 0; i < mCount; i++)
{
cout << mData[i];
if (i < mCount - 1)
cout << ", ";
}
cout << ")" << "\n\n";
}
template <class T>
bool Array<T>::isEmpty()
{
return mCount == 0;
}
template <class T>
int Array<T>::size()
{
return mCount;
}
// Operator Overloads
// --------------------------------------------------------
template <class T>
T & Array<T>::operator[](const int index)
{
return mData[index];
}
#endif
如果您需要任何其他信息,请告诉我,我可以post。
假设 mCount
保持数组中元素的数量,那么当添加一个新元素时你真的必须至少分配 mCount + 1
个元素(当然假设你想保留所有旧元素一个和一个新的)来自:
T * tmp = new T[mCount + 1];
相对于:
T * tmp = new T[mCount];
如果不是出于教育目的,请改用std::vector
。例如,您的 add
函数不是异常安全的。