개발/C++
12장 템플릿, 벡터, 스택
민돌이2
2019. 5. 13. 13:43
한성대학교 김설현교수님 강의내용을 바탕으로 작성함
템플릿의 기본함수와 클래스에서 유형을 매개변수화 하는 기능(int, double 등 템플릿 T로 합칠 수 있다.)
int maxValue(int val1, int val2)
{
if (val1 > val2)
return val1;
else
return val2;
}
double maxValue(double val1, double val2)
{
if (val1 > val2)
return val1;
else
return val2;
}
char maxValue(char val1, char val2)
{
if (val1 > val2)
return val1;
else
return val2;
}
string maxValue(string val1, string val2)
{
if (val1 > val2)
return val1;
else
return val2;
}
다른 자료형에 대한 템플릿화
template <typename T1, typename T2>
void myprint(T1& a, T2& b)
{
cout << a << " " << b << endl;
}
cpp파일에 구현시 컴파일 못하는 경우가 많아 헤더파일에 구현까지한다.
GenericStack.h
#ifndef STACK_H
#define STACK_H
template<typename T>
class Stack
{
public:
Stack();
bool empty() const;
T peek() const;
void push(T value);
T pop();
int getSize() const;
private:
T elements[100];
int size;
};
template<typename T>
Stack<T>::Stack()
{
size = 0;
}
template<typename T>
bool Stack<T>::empty() const
{
return (size == 0);
}
template<typename T>
T Stack<T>::peek() const
{
return elements[size - 1];
}
template<typename T>
void Stack<T>::push(T value)
{
elements[size++] = value;
}
template<typename T>
T Stack<T>::pop()
{
return elements[--size];
}
template<typename T>
int Stack<T>::getSize() const
{
return size;
}
#endif
main.cpp
template<typename T>
void printStack(Stack<T>& stack) //참조에 의한 전달
{
while (!stack.empty())
cout << stack.pop() << " " << endl;
}
int main()
{
Stack<int> intStack; // int형 stack 생성
for (int i = 0; i < 3; i++)
intStack.push(i);
printStack(intStack);
Stack<string> stringStack; // string형 stack 생성
stringStack.push("Chicago");
stringStack.push("Denver");
printStack(stringStack);
system("pause");
return 0;
}
STL과 벡터 클래스
STL(Standard Template Library)는 템플릿을 사용해 만들어진 라이브러리
STL속 vector클래스는 배열처럼 크기가 고정된다는 제한이 없이 크기가 자동증가 되므로 유연한 사용 가능
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<int> intVector; //int형 빈 벡터 생성
for (int i = 0; i < 5; i++)
intVector.push_back(i + 1);
cout << "intVector: ";
for (int i = 0; i < intVector.size(); i++)
cout << intVector[i] << " ";
vector<string> stringVector; // string형 빈 벡터 생성
stringVector.push_back("Dallas");
stringVector.push_back("Houston");
stringVector.push_back("Austin");
cout << "\nstringVector: ";
for (int i = 0; i < stringVector.size(); i++)
cout << stringVector.at(i) << " ";
stringVector.pop_back(); // 마지막 벡터 삭제
stringVector[0] = "Atlanta"; //벡터[0]변경
cout << "\nAtfter stringVector: ";
for (int i = 0; i < stringVector.size(); i++)
cout << stringVector.at(i) << " ";
cout << endl;
system("pause");
return 0;
}
728x90