void bubble_sort(int* list,int n){
int i,j,temp;
for(i=n-1; i>0; i--){
for(j=0; j<i; j++)
if(list[j]>list[j+1])
SWAP(list[j],list[j+1],temp);
}
}
void shell_sort(int* list, int n){
int i,gap;
for(gap=n/2;gap>0;gap=gap/2){
if((gap%2) == 0 ) gap++;
for(i=0;i<gap;i++)
insertion_sort(list,i,n-1,gap);
}
}
void insertion_sort(int* list,int first,int last,int gap)
{
int i,j,key;
for(i=first+gap;i<=last;i=i+gap){
key=list[i];
for(j=i-gap;j>=first && key<list[j];j=j-gap)
list[j+gap]=list[j];
list[j+gap]=key;
}
}
1. 기존의 예외처리 방식
int main(){
int a,b;
cout<<"두개의 숫자입력 :";
cin>>a>>b;
if(b==0) //예외상황이 발생을 한다면
cout<<"오류"<<endl;
else{
cout<<"a/b의 몫 :"<<a/b<<endl;
cout<<"a/g의 나머지 : "<<a%b<<endl;
}
return 0;
}
int main(){
int a,b;
cout<<"두개의 숫자입력:";
cin>>a>>b;
try{
if(b==0)
throw b; // b를 가리켜 예외라고 한다
cout<<"a/b의 몫 : "<<a/b<<endl;
cout<<"a/b의 나머지 : "<<a%b<<endl;
}
catch(int exception){
cout<<exception<<"입력."<<endl;
cout<<"입력오류"<<endl;
}
template <typename T> == template <class T>
같은 의미이다 그러나 과거에 주로 사용되던 방식이 후자이다.
T는 자료형을 결정짓지 않겠다는 의미로 사용된것이다.
#include <iostream>
using std::cout;
using std::endl;
template <typename T>
T Add(T a, T b){
return a+b;
}
int main(){
cout<<Add(10,20)<<endl;
cout<<Add(1.1,2.2)<<endl;
return 0;
}
첫번째 Add함수 호출시에는 전달되는 인자가 int형 데이터이다 .이런경우 템플릿으로 정의되어
있는 Add함수의 T는 int로 인식이 된다.
두번째 Add함수 호출시에는 double형이기때문에 double로 인식된다.
템플릿으로 정의된 함수의 자료형이 결정되는 시점은 인자가 전달되는 순간이다.
2. 함수 템플릿
둘이상의 타입에 대해 템플릿화 하기
template <typename T1,typename T2> //함수 템플릿 정의
T1과T2라는 이름에 대해 다음에 정의하는 대상을 템플릿으로 선언한다. 라는 의미.
함수템플릿의 특수화
template <> //함수 템플릿의 특수화 선언
template <typename T>
int sizeOf(T a){
return sizeof(a);
}
template<>
int sizeOf(char* a){
return strlen(a);
}
int main(){
int i=10;
double e=7.7;
char* str="Good Morning";
cout<<sizeOf(i)<<endl;
cout<<sizeOf(e)<<endl;
cout<<sizeOf(str)<<endl;
return 0;
}
template 다음에 정의하는 대상을 T라는 이름에 대해서 템플릿화 하겠다.
클래스 템플릿의 개체를 생성할때는
Data dd(10); 이 아니라 Data<int> dd(10); 으로 해주어야 한다.
객체는 1)메모리공간 할당 2)생성자 호출의 순으로 생성이 되는데 Data dd(10)을 하면 T의 자료형
이 무엇인지 모르기 때문에 메모리 공간의 할당을 얼만큼 해줘야 하는지 모른다.그렇기때문에
객체를 생성할때 명시적으로 선언을 해주어야 한다. Data<int> dd(10);
클래스 템플릿의 선언과 정의 분리
template <typename T>
class Data{
T data;
public:
Data(T d);
void SetData(T d);
T GetData();
};
template <typename T>
Data<T>::Data(T d){
data=d;
}
template <typename T>
void Data<T>::SetData(T d){
data=d;
}
template <typename T>
T Data<T>::GetData(){
return data;
}
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 10000
#define SWAP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
int list[MAX_SIZE];
int n;
void selection_sort(int* list,int n){
int i,j,least,temp;
for(i=0; i<n-1; i++){
least = i;
for(j=i+1; j<n; j++)
if(list[j]<list[least]) least =j;
SWAP(list[i],list[least],temp);
}
}
void main(){
int i;
n = MAX_SIZE;
for(i=0; i<n; i++)
list[i] = rand()%n;
selection_sort(list,n);
for(i=0; i<n; i++)
printf("%d\n",list[i]);
}