I implemented a basic dynamic array using C++.
When deleting an element and shifting the others, the last element will be twice repeated (the original still exists after copying). I want to avoid memory leaking by deallocating the last element of the array. Currently, I do this by shrinking once after a number of deletions. Are there better solutions?
Finally, I am interested in some feedback on this implementation.
#include <iostream>
#include <stdexcept>
using namespace std;
class DynamicArray {
protected:
int size;
int* arr;
int length;
void grow() {
copyToNewSize(size * 2);
}
void shrink() {
copyToNewSize(size / 2);
}
void copyToNewSize(int newSize) {
int* temp = new int[newSize];
if (newSize > size)
for (int i = 0; i < size; i++) {
temp[i] = arr[i];
}
else
for (int i = 0; i < newSize; i++) {
temp[i] = arr[i];
}
delete[] arr;
size = newSize;
arr = temp;
}
void checkIndex(int index) {
if (index >= length || index < 0)
throw "Index is out of the array range!";
}
public:
DynamicArray(int startingSize) {
size = startingSize;
arr = new int[size];
length = 0;
}
~DynamicArray() {
delete[] arr;
}
int push(int value) {
length++;
if (length == (size + 1))
grow();
arr[length - 1] = value;
return length;
}
int pop() {
length--;
int value = arr[length];
// memory leaking , delete arr[length]
if (length <= size / 2)
shrink();
return value;
}
int insert(int index, int value) {
checkIndex(index);
length++;
if (length == (size + 1))
grow();
for (int i = length - 1; i > index; i--) {
arr[i] = arr[i - 1];
}
arr[index] = value;
return length;
}
int remove(int index) {
checkIndex(index);
int value = arr[index];
length--;
for (int i = index; i < length; i++)
arr[i] = arr[i + 1];
// memory leaking , delete arr[length]
if (length <= (size / 2))
shrink();
return value;
}
int get(int index) {
checkIndex(index);
return arr[index];
}
void set(int index, int value) {
checkIndex(index);
arr[index] = value;
}
int search(int value) {
for (int i = 0; i < length; i++) {
if (arr[i] == value)
return i;
}
return -1;
}
int getLength() {
return length;
}
}
std::vector<int>
or one of the other standard containers? \$\endgroup\$