Отказ от ответственности 1 — я новичок в программировании
Отказ от ответственности 2 — Я искал и искал, но не могу найти помощь, которую я ищу.
Для проекта я более или менее переписываю векторный класс в более урезанной форме. Часть, с которой я зависаю — это написание метода push_back. Все хорошо, пока я не увеличу емкость массива.
Я предполагаю, что нужно сделать, это создать новый вектор с увеличенным размером, а затем скопировать элементы из старого вектора в новый, а затем с помощью оператора присваивания назначить oldVector для newVector.
Я либо неправильно написал метод push_back, либо неправильно перегрузил оператор =, либо мне просто не хватает понимания того, что должно происходить. Любая помощь будет принята с благодарностью.
При компиляции я получаю ошибку «lvalue требуется как левый операнд присваивания» в строке, где я присваиваю this = tempV
template <class T>
Vector<T>& Vector<T>::operator = (const Vector<T> & v)
{
int newSize = v.size();
int newCapacity = v.getCapacity();
data = new T[newCapacity];
for(int i = 0; i < newSize; i++)
data[i] = v.data[i];
return *this;
}
template <class T>
void Vector <T> :: push_back(const T & number)
{
if(numItems == capacity)
{
Vector <T> tempV(this->capacity * 2);
for(int i = 0; i < numItems; i++)
tempV.data[i] = data[i];
*this = tempV;
}
if(numItems < capacity)
data[numItems++] = number;
}
ОБНОВИТЬ
Итак, я понимаю, почему мой код не компилируется при использовании
*this = tempV;
в моем методе копирования я использовал v.size, а не v.size () в качестве метода. После исправления код компилируется и запускается, однако емкость моего вектора такая же и не увеличилась, как я ожидал. Я все еще что-то упускаю. Код выше был обновлен.
Еще раз спасибо за любую помощь!
Почему вы должны создать новый Vector<T>
? Просто создайте новый массив:
template <class T>
void Vector <T> :: push_back(const T & number)
{
if(numItems == capacity)
{
capacity *= 2;
T* newData = new T[capacity];
std::copy(data, data + numItems, newData);
delete[] data;
data = newData;
}
data[numItems++] = number;
}