C++中的动态数组实现
Dynamic Array implementation in C++
我正在尝试使用 C++ 实现动态数组。但是,我的 resize()
功能似乎无法正常工作。没有错误或警告。我做了一些研究,并试图查看在互联网上找到的其他实现,但无法解决问题。我把我的代码放在下面。
#include <iostream>
class Array
{
private:
int* arr;
int size = 0;
int capacity = 1;
public:
Array() { arr = new int[capacity]; }
Array(int capacity)
:
capacity(capacity)
{
arr = new int[capacity];
}
int length() const { return size; }
bool is_empty() const { return (length() == 0); }
int get(int index) const { return arr[index]; }
void set(int index, int value) { arr[index] = value; }
void resize()
{
capacity *= 2;
int* temp = new int[capacity];
for (int i = 0; i < size; i++) { temp[i] = arr[i]; }
delete[] arr;
arr = temp;
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
}
void add(int value)
{
if (size + 1 >= capacity) { resize(); }
arr[size++] = value;
}
void remove(int index)
{
for (int i = index; i < size - 1; i++)
{
arr[i] = arr[i + 1];
}
size--;
}
int& operator[](int index)
{
return arr[index];
}
};
int main()
{
Array array;
for (int i = 0; i < 5; i++)
{
array.add(i + 1);
}
for (int i = 0; i < array.length(); i++)
{
std::cout << array.get(i) << " ";
}
std::cout << '\t' << array.length() << '\n';
return 0;
}
代码输出:
0 0 0 4 5 5
但我希望它输出:
1 2 3 4 5 5
在您的 resize
方法中,您复制了 arr
中的现有元素
for (int i = 0; i < size; i++) { temp[i] = arr[i]; }
但后来你0
所有的元素都出来了,有效地清除了以前的数据
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
相反,您可能只想 0
尾随的新元素
for (int i = size; i < capacity; ++i) { arr[i] = 0; }
这个循环
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
不正确。它将第一个大小元素设置为 0。
其实这个循环是多余的。除了这个循环,你可以只写在分配内存的语句中,比如
int* temp = new int[capacity]();
另外函数add()
的定义也不正确。它应该看起来像:
void add(int value)
{
if (size == capacity) { resize(); }
arr[size++] = value;
}
您需要显式定义析构函数。例如
~Array()
{
delete []arr;
}
您还需要显式定义复制构造函数和复制赋值运算符,或者将它们定义为已删除。例如
Array( const Array & ) = delete;
Array & operator =( const Array & ) = delete;
否则使用这些成员函数会导致未定义的行为。
我正在尝试使用 C++ 实现动态数组。但是,我的 resize()
功能似乎无法正常工作。没有错误或警告。我做了一些研究,并试图查看在互联网上找到的其他实现,但无法解决问题。我把我的代码放在下面。
#include <iostream>
class Array
{
private:
int* arr;
int size = 0;
int capacity = 1;
public:
Array() { arr = new int[capacity]; }
Array(int capacity)
:
capacity(capacity)
{
arr = new int[capacity];
}
int length() const { return size; }
bool is_empty() const { return (length() == 0); }
int get(int index) const { return arr[index]; }
void set(int index, int value) { arr[index] = value; }
void resize()
{
capacity *= 2;
int* temp = new int[capacity];
for (int i = 0; i < size; i++) { temp[i] = arr[i]; }
delete[] arr;
arr = temp;
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
}
void add(int value)
{
if (size + 1 >= capacity) { resize(); }
arr[size++] = value;
}
void remove(int index)
{
for (int i = index; i < size - 1; i++)
{
arr[i] = arr[i + 1];
}
size--;
}
int& operator[](int index)
{
return arr[index];
}
};
int main()
{
Array array;
for (int i = 0; i < 5; i++)
{
array.add(i + 1);
}
for (int i = 0; i < array.length(); i++)
{
std::cout << array.get(i) << " ";
}
std::cout << '\t' << array.length() << '\n';
return 0;
}
代码输出:
0 0 0 4 5 5
但我希望它输出:
1 2 3 4 5 5
在您的 resize
方法中,您复制了 arr
for (int i = 0; i < size; i++) { temp[i] = arr[i]; }
但后来你0
所有的元素都出来了,有效地清除了以前的数据
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
相反,您可能只想 0
尾随的新元素
for (int i = size; i < capacity; ++i) { arr[i] = 0; }
这个循环
for (int i = 0; i < capacity; i++) { arr[i] = 0; }
不正确。它将第一个大小元素设置为 0。
其实这个循环是多余的。除了这个循环,你可以只写在分配内存的语句中,比如
int* temp = new int[capacity]();
另外函数add()
的定义也不正确。它应该看起来像:
void add(int value)
{
if (size == capacity) { resize(); }
arr[size++] = value;
}
您需要显式定义析构函数。例如
~Array()
{
delete []arr;
}
您还需要显式定义复制构造函数和复制赋值运算符,或者将它们定义为已删除。例如
Array( const Array & ) = delete;
Array & operator =( const Array & ) = delete;
否则使用这些成员函数会导致未定义的行为。