diff --git a/td/td1/include/vector.h b/td/td1/include/vector.h index b248fd0..0710a1e 100644 --- a/td/td1/include/vector.h +++ b/td/td1/include/vector.h @@ -4,37 +4,40 @@ #include #include -template -class Vector{ +template +class Vector { public: Vector(); Vector(size_t capacity); Vector(size_t capacity, T value); + Vector(const Vector& other); ~Vector(); size_t Size(); size_t Capacity(); void PushBack(T value); - template + template friend std::ostream& operator<<(std::ostream& stream, const Vector& vec); - template + template friend std::istream& operator>>(std::istream& stream, Vector& vec); + + Vector& operator=(const Vector& other); + private: - T* _values; size_t _capacity; size_t _size; + T* _values; }; -template -Vector::Vector() +template +Vector::Vector() : _capacity(1) , _size(0) + , _values(new T[1]) { - // A vector must at least have a capacity of 1 - _values = new T[1]; } -template -Vector::Vector(size_t capacity) +template +Vector::Vector(size_t capacity) : _capacity(capacity) , _size(0) { @@ -42,42 +45,64 @@ Vector::Vector(size_t capacity) _values = new T[capacity]; } -template -Vector::Vector(size_t capacity, T value) +template +Vector::Vector(size_t capacity, T value) : _capacity(capacity) , _size(capacity) { // Allocating the heap and setting the value to each element. _values = new T[capacity]; - for(size_t i = 0; i +Vector::Vector(const Vector& other) + : _capacity(other._capacity) + , _size(other._size) + , _values(new T[other._capacity]) +{ + for (size_t i = 0; i < other._size; i++) + _values[i] = other._values[i]; +} -template +template Vector::~Vector() { delete[] _values; } -template +template +Vector& Vector::operator=(const Vector& other) +{ + if (this != &other) { + this->_capacity = other._capacity; + this->_size = other._size; + delete[] this->_values; + this->_values = new T[other._capacity]; + for (size_t i = 0; i < other._size; i++) + this->_values[i] = other._values[i]; + } + return *this; +} + +template size_t Vector::Capacity() { return _capacity; } -template +template size_t Vector::Size() { return _size; } -template +template void Vector::PushBack(T value) { // if the next size will overload the heap - if (_capacity < _size+1) - { + if (_capacity < _size + 1) { // Keep a track of the old pointer T* oldPtr = _values; // Creating a new pointer by resizing its capacity by factor 2. - _values = new T[_size*2]; - _capacity*=2; + _values = new T[_size * 2]; + _capacity *= 2; // Copying the old array onto the new - for(size_t i=0; i<_size; i++) + for (size_t i = 0; i < _size; i++) _values[i] = oldPtr[i]; // Deallocating the old array delete[] oldPtr; @@ -88,22 +113,22 @@ void Vector::PushBack(T value) } // methode get -template +template std::ostream& operator<<(std::ostream& stream, const Vector& vec) { - for(size_t i=0; i +template std::istream& operator>>(std::istream& stream, Vector& vec) { - for(size_t i=0; i> vec._values[i]; vec._size = vec._capacity; return stream; } -#endif //HEADER_VECTOR \ No newline at end of file +#endif // HEADER_VECTOR \ No newline at end of file diff --git a/td/td1/src/main.cpp b/td/td1/src/main.cpp index 6458b22..c533303 100644 --- a/td/td1/src/main.cpp +++ b/td/td1/src/main.cpp @@ -15,6 +15,13 @@ int main(void) std::cout << "Capacity of charVector:" << charVector.Capacity() << "\t Size of charVector: " << charVector.Size() << std::endl; std::cin >> charVector; std::cout << "char vector: " << charVector << std::endl; + + Vector anotherVector = charVector; + std::cout << "char vector: " << charVector << std::endl; + + Vector copiedVector; + copiedVector = anotherVector; + std::cout << "char vector: " << charVector << std::endl; return 0; }