Template을 쓰는 가장 강력한 이유는 바로 '어떠한 타입으로도 인스턴스화 가능'하다는 것이다.
인스턴스를 가장 잘 설명하는 예시는
Bag <int> a;
Bag <Rectangle> r;
우리는 Bag을 이용해 <int>형 객체뿐만 아니라 <rectangle>형 객체도 만들 수 있다!
PPT 템플릿 왜 갖다 쓰는지 생각해봐라
누군가가 템플릿으로 만들어주거나 만든 템플릿을 잘 활용할 수 있다면 나는 그저 선언하고 사용하는 것만으로도 설계 구조까지 통째로 가져다 재사용할 수 있다는 장점이 있다.
Template을 이용해 Stack 구현하기
코드에서 집중적으로 볼 것
Template이 어떻게 쓰였는가?
Push와 Pop에는 각각 ++, --연산자가 다르게(전위,후위) 쓰였음을 주의하자.
#include <iostream>
#include <algorithm>
#define SIZE 10
using namespace std;
template <typename T>
class Stack {
private:
T* data ;
int top;
int capacity;
public:
Stack(int size = SIZE) {
data = new T[size];
capacity = size;
top = -1;
};
void changeSize1D(T *&a, const int oldSize, const int newSize) {
if (newSize < 0) throw "New Length must be >=0";
T* temp = new T[newSize];
int number = min(oldSize, newSize);
copy(a, a + number, temp);
delete[] a;
a = temp;
}
void Push(T x)
{
if (top == capacity - 1) {
changeSize1D(data, capacity, 2 * capacity);
capacity *= 2;
}
data[++top] = x;
}
void Pop() {
if (IsEmpty()) throw "Stack is Empty. Cannot Delete";
data[top--].~T();
}
bool IsEmpty() const { return top == -1; }
void Print() {
for (int i = 0; i < top + 1; ++i)
cout << data[i] << ' ';
}
};
int main() {
Stack<int> s;
for (int i = 0; i < 5; i++) {
int IN;
cin >> IN;
s.Push(IN);
s.Print();
cout << endl;
}
for (int i = 0; i <3; i++) {
s.Pop();
cout << "하나 없앱니다 POP!!";
s.Print();
cout << endl;
}
}
다음은 공부하면서 들었던 의문에 대해 적어봤다. class에서 쓰이는 ::에 대한 설명이다.
Stack::Pop() { ... };
여기서 '::' 이 의미하는 건 뭐지??? 꼭 필요할까??
결론부터 말하면 클래스 메소드를 만들 때 쓰인다!
class 하나를 만들어보자.
class Stack{
private : ~~~
public : ~~~
void Pop {
난 이런 pop시키는 함수를 만들고 싶다.
}
}
나는 Stack과 관련한 함수를 만들고 싶다.
이때 그냥 class안에 함수 정의를 해주면 void Pop(){ ~~ } 이렇게 해주면 되지만,
class 밖에 따로 할당해주고자 할 때는 Stack::Pop(){~~} 으로 써주어야 Stack의 함수임을 알 수 있다!
즉, :: 는 클래스 메소드를 위해 존재하는 것이다.
'KAU > C++ 자료구조' 카테고리의 다른 글
[자료구조] BinaryTree 순회하기 구현 (0) | 2022.06.10 |
---|---|
연결리스트 - 요소 추가 시 배열보다 훨씬 편리하다 ! (0) | 2022.06.10 |
희소행렬 전치 + 빠른 전치 (0) | 2022.06.10 |
다항식의 곱셈(C++ , overloading) (0) | 2022.06.09 |
순열 생성 (0) | 2022.06.09 |