Created
December 5, 2023 21:27
-
-
Save Moderrek/d8f62543842f68a47285e447a2ec113c to your computer and use it in GitHub Desktop.
Vector Array implementation in C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#ifndef VEC_HPP_INCLUDED | |
/* | |
Author: Tymon Woźniak <https://github.com/Moderrek> | |
Vector Array implementation in C++ by Tymon Woźniak | |
*/ | |
#define VEC_HPP_INCLUDED | |
#include <iostream> | |
#include <string> | |
template <typename T> | |
class Vec { | |
public: | |
Vec(); | |
Vec(const Vec& t); | |
Vec(std::initializer_list<T> args); | |
~Vec(); | |
void operator=(const Vec& t); | |
size_t size() const; | |
T& operator[](size_t idx); | |
const T& operator[](size_t idx) const; | |
void push(T x); | |
T pop(); | |
private: | |
void clone(const Vec& t); | |
void free(); | |
T* tab; | |
size_t length; | |
size_t capacity; | |
}; | |
template <typename T> | |
Vec<T>::Vec() { | |
capacity = 1; | |
tab = new T[capacity]; | |
length = 0; | |
} | |
template <typename T> | |
Vec<T>::Vec(const Vec& t) { | |
clone(t); | |
} | |
template <typename T> | |
Vec<T>::Vec(std::initializer_list<T> args) { | |
capacity = args.size(); | |
tab = new T[capacity]; | |
length = 0; | |
for (auto i : args) { | |
push(i); | |
} | |
} | |
template <typename T> | |
void Vec<T>::operator=(const Vec& t) { | |
if (this == &t) { | |
return; | |
} | |
free(); | |
clone(t); | |
} | |
template <typename T> | |
Vec<T>::~Vec() { | |
free(); | |
} | |
template <typename T> | |
size_t Vec<T>::size() const { | |
return length; | |
} | |
template <typename T> | |
T& Vec<T>::operator[](size_t idx) { | |
return tab[idx]; | |
} | |
template <typename T> | |
const T& Vec<T>::operator[](size_t idx) const { | |
return tab[idx]; | |
} | |
template <typename T> | |
void Vec<T>::clone(const Vec& t) { | |
length = t.length; | |
capacity = t.capacity; | |
tab = new T[capacity]; | |
for (size_t i = 0; i < length; i += 1) { | |
tab[i] = t.tab[i]; | |
} | |
} | |
template <typename T> | |
void Vec<T>::free() { | |
delete[] tab; | |
} | |
template <typename T> | |
void Vec<T>::push(T x) { | |
if (length == capacity) { | |
capacity *= 2; | |
T* tmp = new T[capacity]; | |
for (size_t i = 0; i < length; i += 1) { | |
tmp[i] = tab[i]; | |
} | |
delete[] tab; | |
tab = tmp; | |
} | |
tab[length++] = x; | |
} | |
template <typename T> | |
T Vec<T>::pop(){ | |
return tab[--length]; | |
} | |
template <typename T> | |
std::ostream& operator<<(std::ostream& os, const Vec<T>& tab) { | |
os << '['; | |
for (size_t i = 0; i < tab.size(); i += 1) { | |
if (i > 0) os << ", "; | |
os << tab[i]; | |
} | |
os << ']'; | |
return os; | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example use