091

[C/C++] 템플릿, STL 본문

Programming Language/C&C++

[C/C++] 템플릿, STL

공구일 2024. 12. 16. 04:44
728x90

01. 템플릿(template) : 포괄적 함수(generic function)

template <class T> 
T Max(T x, T y) { return x>y?x:y;} //typename을 사용해도 됨

- 인자(매개변수)를 통한 다형성을 제공하며, 코드의 변화없이 형만 다른 함수가 필요한 경우에 사용하는 것이 좋음 -> 게빌지기 민들어야하는 코드를 컴파일러가 대신 만들기 때문에 템플릿을 사용하더라도 코드는 줄어들지 않음

-> class 위치에 typename도 사용할 수 있는데 함수 템플릿에서는 typename을 더 선호하고 클래스 템플릿에서는 class를 더 선호

- 참조자(reference) : 기존 변수에 대한 별명으로, 참조자를 통해 원래 변수를 직접 수정할 수 있음(원래 변수를 통해 참조자도 수정가능)

#include <iostream>
using std::cout;
using std::endl;
int main(void)
{
    int x = 10;
    int& rx = x; //rx는 x의 참조자
    cout << x << " " << rx << endl;
    rx = rx + 10;
    cout << x << " " << rx << endl; //참조자(rx)에 변화를 주면 그 타켓(x)도 변함
    x = x + 10;
    cout << x << " " << rx << endl; //타켓(x)에 변화를 주면 그 참조자(rx)도 변함
    return 0;
}

- 일반화된 클래스 구현 : 객체를 선언할 때 클래스명 옆에 <매개변수자료형리스트>를 작성해줘야함

#include <iostream>
using std::cout;
using std::endl;
template <class T1, class T2> class CCC
{
    T1 x;
    T2 y;
public:
    CCC(T1 xx, T2 yy) {x=xx;y=yy;}
    void Print(){ cout<<x<<','<<y<<endl;}
};
int main()
{
    CCC<int, int> c1(10,20);
    CCC<double,double> c2(3.5,5.5);
    CCC<char, const char*> c3('I', "Love You!");
    
    c1.Print();
    c2.Print();
    c3.Print();
    return 0;
}

 

02. STL(Standard Template Library)

- 자료구조 클래스와 알고리즘 등을 미리 만들어 놓은 라이브러리로 반복자를 가지고 동작하는 표준 라이브러리의 일부분

- vector 컨테이너에서 push_back(요소)를 사용하여 새로운 요소 추가, size()를 통해 사이즈 알 수 있음

#include <iostream>
#include <vector>
using namespace std;
int main( )
{
    vector <int> x; //int x[10]와 차이
    // 여러 개 int형을 가지고 노는 배열 공간을 만들고 싶어요
    x.push_back(1);
    x.push_back(2);
    for(int i = 0 ; i < x.size() ; i++)
        cout << x[i] << endl; //1 2
    return 0;
}

 

03. 예외처리(exception handling, error handling)

- 예외 처리란 실행 시간에 발생할 수 있는 오류를 처리하는 것

#include <iostream>
using std::cout;
using std::cin;
using std::endl;
void Div(double ja, double mo){
try{
    if(!mo) throw mo;
    cout<<"결과:"<<ja/mo<<endl;
}
catch(double){ //mo가 double형
    cout<<"오류:영으로 나눌 수 없음";
}
}
int main()
{
    double x, y;
    cout <<"분자를 입력하세요=";
    cin>>x;
    cout <<"분모를 입력하세요=";
    cin>>y;
    Div(x, y);
    return 0;
}

 

04. 파일 입출력

- 형식 설정 멤버 함수 : 폭, 정밀도 등을 설정하는 멤버함수가 제공

#include <iostream>
using namespace std;
int main(){
    cout << "디폴트\n";
    cout.width(10);
    cout << -50 << endl; //(7공백)-50
    cout << "[ * fill ]\n";
    cout.fill('*');
    cout.width(10);
    cout << -50 << endl; //*******-50
    cout.width(10);
    cout << 100.25 << endl; //****100.25
    cout.width(10);
    cout << "HanSH"<<endl; //*****HanSH
    cout.fill(' ');
    cout.precision(6); //소수점을 제외한 전체 자리수
    cout<< 12.34567<<endl; //12.3457
    cout << fixed; //소수점 이하의 자리수만 다루게 함
    cout.precision(3); //12.346
    cout << 12.34567 << endl;
    return 0;
}

- width()함수의 영향은 일시적이므로 매 출력 시마다 지정해줘야하지만 fill()함수는 한번 지정하면 그 효과가 계속 유지됨

- setfill(char)의 경우에도 한번 지정하고 나면 그 효과가 유지됨, setw(int)의 경우 소수점을 포함한 값

 

- 파일클래스에는 ifstream, ofstream, fstream이 있고 각각 읽기, 쓰기, 읽기와 쓰기를 모두 가능하게 하는 클래스임

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ofstream hout("test.txt"); // 출력파일 스트림 객체 hout 선언
    if(!hout){
        cout<<"출력할 파일을 열 수 없습니다.";
        return 1;
    }
    hout<<"Han\n";
    hout<<100<<endl<<hex<<100<<endl;
    hout.close(); //파일 종결
    return 0;
}

- Han 100 64(100의 16진수)

#include <iostream>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream hin("test.txt"); // 입력파일 스트림 객체 hin 선언
    if(!hin){
    cout<<"입력할 파일을 열 수 없습니다.";
    return 1;
    }
    
    char str[50];
    int i,j;
    hin>>str>>i>>j;
    cout<<str<<" "<<i<<" "<<j<<endl;
    hin.close(); // 파일 종결
    return 0;
}
728x90