이름 수행시간 알고리즘 예시 설명
상수 시간 O(1) 값을 검색할 때, 객체에서 키를 알거나 배열에서 인덱스를 알고 있으면 언제나 한 단계만 걸림. 입력값 n 이 주어졌을 때, 알고리즘이 문제를 해결하는데 오직 한 단계만 거침
지수 시간 O(C^n) 동적 계획법을 사용한 외판원 문제 해결 문제를 해결하기 위한 단계의 수는 주어진 상수값 C 의 n 제곱
선형 시간 O(n) 정렬되지 않은 배열에서
가장 작은 수 또는 가장 큰 수를 탐색
문제를 해결하기 위한 단계의 수와 입력값 n이 1:1 관계를 가짐
로그 시간 O(log n) 배열에서 값을 찾을 때, 어느 쪽에서 시작할지를 알고 있으면 검색하는 시간이 두배로 줄어듦 입력값 n 이 주어졌을 때, 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듦.

 

'Programming > C++ Basic' 카테고리의 다른 글

C++ 함수 템플릿, 클래스 템플릿  (0) 2020.09.23
C++ 함수 객체  (0) 2020.09.23
C++ 임시 객체  (0) 2020.09.23
C++ 연산자 오버로딩(operator)  (0) 2020.09.23
C++ 인라인  (0) 2020.09.23

템플릿의 형태

1
2
3
4
5
template <typename T>
T 함수이름(T _a, T _b)
{
    
}
cs
 

#1. 함수와 템플릿

-> 템플릿 함수

1
2
3
4
5
template <typename T>
T Add(T _a, T _b)
{
    return _a + _b;
}
cs

-> 컴파일 중 템플릿을 호출하는 코드라인을 컴파일할 때

-> 컴파일러가 실제 함수의 코드를 생성한다.

-> <>안에 명시한 자료형이 함수 템플릿에서 정의한 T자리에 매칭이 된다.

-> 사용자가 <>를 명시하지 않을 경우 인자의 타입에 따라 템플릿 함수가 생성된다.

-> 템플릿 함수는 일반적으로 포인터간의 + 연산은 불가능하다.

-> 하지만 템플릿의 특수화(오버로딩)를 통해서 합치는 방법이 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <>
char* Add(char* _a, char* _b)
{
    char* pStr = new char[strlen(_a) + strlen(_b) + 1];
 
    strcpy_s(pStr, strlen(_a) + strlen(_b) + 1, _a);
    strcat_s(pStr, strlen(_a) + strlen(_b) + 1, _b);
 
    return pStr;
}
 
 
void main()
{    
    char* pStr = Add<char*>("Hello""World");
 
    cout << pStr << endl;
 
    delete[] pStr;
}
cs

 

두 가지 이상의 자료형을 사용하는 경우

1
2
3
4
5
6
7
8
9
10
11
12
template <typename T1, typename T2, typename T3>
T3 Add(T1 _a, T2 _b)
{
    return _a + _b;
}
 
 
void main()
{
    double dA = Add<intfloatdouble>(103.14f);
    cout << dA << endl;
}
cs

 

클래스 템플릿

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template <typename T>
class CObj
{
public:
    CObj() {}
    CObj(T _a, T _b) : m_A(_a), m_B(_b) {}
 
private:
    T    m_A;
    T    m_B;
};
 
void main()
{    
    CObj<int>        ObjInt;
    CObj<float>        ObjFloat;
}
cs

 

템플릿의 파일 분할

-> 템플릿은 파일 분할을 하지않는다.

-> 파일 분할을 하게되면 다른 소스파일에서 선언 하였을 때,

-> 해당 템플릿의 정의부를 알 수 없기 때문에 컴파일러가 템플릿 클래스를 생성할 수가 없다.(링커 오류가 발생)

-> 템플릿 클래스는 선언한 코드라인을 컴파일 할 때 생성한다.

-> 그러므로 템플릿을 사용할 때는 헤더파일에 선언과 정의를 같이 해줘야 한다.

 

 

템플릿의 상속

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
class CObj
{
public:
    void Func()
    {
 
    }
};
 
template <typename T>
class CPlayer : public CObj<T>
{
 
};
cs

 

#1. 어떤 자료형을 사용하는 클래스인지 알려주어야 한다.

#2. T는 무엇인지 알려주어야 한다.

 

템플릿과 static

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
template <typename T>
class CObj
{
public:
    void Func()
    {
        m_Static += 1;
        cout << m_Static << endl;
    }
 
private:
    static T    m_Static;
};
 
template <typename T>
T CObj<T>::m_Static = 0;
 
void main()
{
    CObj<int>        objInt;
   objInt.Func();     // 1
   objInt.Func();     // 2
   objInt.Func();    // 3
 
    CObj<int>        objInt2;
   objInt2.Func();    // 4
   objInt2.Func();    // 5
   objInt2.Func();    // 6
 
    CObj<float>      objFloat;
   objFloat.Func();   // 1
}
cs

-> 같은 자료형을 사용하는 템플릿 클래스끼리만 static 변수를 공유한다.

-> 자료형이 달라질 경우 static 변수는 공유하지 않는다.(재 생성)

'Programming > C++ Basic' 카테고리의 다른 글

C++ 시간 복잡도  (0) 2020.09.27
C++ 함수 객체  (0) 2020.09.23
C++ 임시 객체  (0) 2020.09.23
C++ 연산자 오버로딩(operator)  (0) 2020.09.23
C++ 인라인  (0) 2020.09.23

함수 객체

-> 객체를 함수처럼 사용하는 것이다.

-> 함수 호출 연산자를 연산자 오버로딩하여 객체를 함수처럼 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CObj
{
public:
    int operator()(int _a, int _b)
    {
        return _a + _b;
    }
};
 
void main()
{
    CObj functor;
    cout << functor(1020<< endl;
    // == functor.operator()(10, 20)
}
cs

 

 

함수 객체를 통해 BubbleSort 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class CSortRule
{
public:
    virtual bool operator()(int _a, int _b) = 0;
};
 
// 오름차순
class CAscending : public CSortRule
{
public:
    virtual bool operator()(int _a, int _b)
    {
        return _a > _b;
    }
};
// _Descending
class CDescending : public CSortRule
{
public:
    virtual bool operator()(int _a, int _b)
    {
        return _a < _b;
    }
};
void BubbleSort(int _iArr[], int _iSize, CSortRule& _Functor)
{
    for (int i = 0; i < _iSize - 1++i)
    {
        for (int j = 0; j < _iSize - 1++j)
        {
            if (_Functor(_iArr[j], _iArr[j + 1]))
            {
                int iTemp = _iArr[j];
                _iArr[j] = _iArr[j + 1];
                _iArr[j + 1= iTemp;
            }
        }
    }
}
 
void main()
{
 
    CAscending            _Ascending;
   CDescending           _Descending;
 
    int iArr[5= { 14253 };
 
    BubbleSort(iArr, 5, _Descending);
 
    for (int i = 0; i < 5++i)
        cout << iArr[i] << endl;
}
cs

'Programming > C++ Basic' 카테고리의 다른 글

C++ 시간 복잡도  (0) 2020.09.27
C++ 함수 템플릿, 클래스 템플릿  (0) 2020.09.23
C++ 임시 객체  (0) 2020.09.23
C++ 연산자 오버로딩(operator)  (0) 2020.09.23
C++ 인라인  (0) 2020.09.23

임시 객체

-> 임시 메모리 영역이 등록된 객체이다.

-> 일반 객체는 자료형 + 변수명으로 선언한다.

-> 임시 객체는 변수명이 없다.

 

일반 객체

-> 함수가 종료될 때까지 메모리에 상주한다.

임시 객체

-> 코드 라인을 벗어나는 즉시 소멸한다.

 

'Programming > C++ Basic' 카테고리의 다른 글

C++ 함수 템플릿, 클래스 템플릿  (0) 2020.09.23
C++ 함수 객체  (0) 2020.09.23
C++ 연산자 오버로딩(operator)  (0) 2020.09.23
C++ 인라인  (0) 2020.09.23
C++ 바인딩  (0) 2020.09.21

+ Recent posts