320x100
#pragma once
#include <iostream>
#include <memory>
template<typename T>
class cst_stack
{
public:
cst_stack() {}
virtual ~cst_stack() {}
virtual void push(T& val) = 0;
virtual void push(T&& val) = 0;
virtual T& pop() = 0;
virtual T& top() = 0;
virtual bool IsEmpty() = 0;
virtual bool IsFull() = 0;
};
template<typename T, size_t size = 128>
class cst_arr_stack : public cst_stack<T>
{
public:
cst_arr_stack() noexcept
:arr(new T[size]), top_(0), max_(size)
{
}
~cst_arr_stack()
{
delete[] arr;
}
void push(T& val) override
{
if (max_ == top_) {
realloc();
}
arr[top_++] = val;
}
void push(T&& val) override
{
if (max_ == top_) {
realloc();
}
arr[top_++] = std::move(val);
}
T& pop() override
{
return arr[--top_];
}
T& top() override
{
return arr[top_ - 1];
}
bool IsEmpty() override
{
return top_ == 0 ? true : false;
}
bool IsFull() override
{
return top_ == max_ ? true : false;
}
void realloc() noexcept
{
max_ = max_ << 1;
T* newarr = new T[max_];
std::fill(newarr, newarr + max_, 0);
for (int i = 0; i < (max_ >> 1); ++i) {
newarr[i] = std::move(arr[i]);
}
delete arr;
arr = newarr;
}
void print()
{
for (int i = 0; i < max_; ++i) {
std::cout << arr[i] << std::endl;
}
}
private:
T* arr;
size_t top_;
size_t max_;
};
기초부터 다시 시작해보는
커스텀 동적 배열 메모리 스택
320x100
'프로그래밍 > C,C++' 카테고리의 다른 글
enum 크기 (0) | 2021.10.06 |
---|---|
자주 사용하는 함수 (0) | 2021.07.30 |
[C++] Object pool (0) | 2021.06.29 |
RTTI란? (0) | 2021.06.18 |
비동기 함수 정리 (0) | 2021.03.22 |