Skip to content

Instantly share code, notes, and snippets.

@Moderrek
Created December 5, 2023 21:27
Show Gist options
  • Save Moderrek/d8f62543842f68a47285e447a2ec113c to your computer and use it in GitHub Desktop.
Save Moderrek/d8f62543842f68a47285e447a2ec113c to your computer and use it in GitHub Desktop.
Vector Array implementation in C++
#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
@Moderrek
Copy link
Author

Moderrek commented Dec 5, 2023

Example use

#include "vec.hpp"

int main() {
    Vec<int> vec = {1, 2, 3, 4};
    vec.push(5);
    std::cout << vec << '\n'; // [1, 2, 3, 4, 5]
    std::cout << vec.pop() << '\n'; // 5
    std::cout << vec << '\n'; // [1, 2, 3, 4]
    vec.push(4);
    std::cout << vec << '\n'; // [1, 2, 3, 4, 4]
    return 0;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment