개발/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