[C++] Template, STL

닿메_dahme
|2025. 1. 2. 21:14

2025년 1월 2일 목요일(2025년이 밝았따..!)

신년인데도 집중이 잘 되지 않는데.. 왜 그럴까? 아직 이해를 잘 못해서 겁부터 먹는듯하다

겁먹지마 파이팅!!!

 

오늘은 Template, STL에 관해 공부를 했다.

Template

  • 일반화된 코드를 작성할 수 있는 문법
  • 정의할 함수 위에 template <typename T> 를 추가하고, 일반화할 타입에 실제 타입 대신 T로 작성하면 끝!
  • 어떤 타입이 올지 모르지만 그 타입을 그냥 T라고 정의하겠다! 라는 의미
  • 근데 모든 매개변수 타입을 일반화할 필요는 없음
    • 배열의 크기 같은 경우는 항상 정수형이므로 그냥 int를 사용해줘도 문제 없음
    • T Add(T arr[], int size) {}
#include <iostream>
using namespace std;

// general programming(일반화된 프로그래밍)
template <typename T>
T Add(T x, T y) {
    return x + y;
}

int main() {
    cout << Add(3, 4) << endl;         // 정수형 덧셈
    cout << Add(3.3, 4.2) << endl;     // 실수형 덧셈

    return 0;
}

 

STL

STL(Standard Template Library)

  • C++에서 제공하는 표준 템플릿 라이브러리

컨테이너

  • 데이터를 담는 자료구조
  • 모든 컨테이너는 템플릿으로 구현되어있음
  • 타입에 상관없이 사용
  • 메모리 관리를 내부적으로 함
    • 사용시 메모리 관리를 고려하지 않아도 됨
  • 모든 컨테이너는 반복자를 가지고 있음
    • 각 컨테이너를 동일한 문법으로 접근 가능

Vetor

  • 배열과 유사하지만 배열의 업그레이드 버전인 컨테이너
  • 템플릿 클래스로 구현되어 있음
  • 삽입되는 원소 개수에 따라 내부 배열의 크기가 자동 관리됨
  • 임의접근이 가능함(인덱스를 통해 특정 위치에 접근 가능)
  • 벡터 특성상 삽입/삭제는 맨 뒤에 하는게 좋음(배열의 특성)

2차원 Vector

vector<vector<int>> vec(3, vec<int>(4, 1)); // 3x4 행렬이고 모든 원소 1로 초기화

vector의 멤버 함수

  • push_back()
    • vector의 맨 끝에 원소를 추가하는 메서드
    • 원소 개수가 늘어남에 따라 크기는 자동으로 증가하기 때문에 크기를 신경 쓸 필요는 없음
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec;
        vec.push_back(10);
        vec.push_back(20);
    
        for (int num : vec) {
            cout << num << " ";
        }
        
        return 0;
    }
    // output
    // 10 20 30
    
  •  pop_back()
    • vector의 맨 끝에 원소 제거하는 메서드
    • 맨 끝 원소가 줄어드니까 크기도 줄어듬
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30};
        vec.pop_back();  // 마지막 요소(30) 제거
    
        for (int num : vec) {
            cout << num << " ";
        }
        
        return 0;
    }
    // output
    // 10 20
    
  •  size()
    • vector의 크기 확인
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30};
        
        cout << vec.size() << endl;
        
        return 0;
    }
    // output
    // 3
    
  •  erase()
    • 특정 위치의 원소 제거
    • 벡터 특성상 시간이 많이 걸리는 함수이기 때문에 되도록이면 지양
    #include <iostream>
    #include <vector>
    using namespace std;
    
    int main() {
        vector<int> vec = {10, 20, 30, 40, 50};
    
        // 두 번째 요소 제거 (index 1)
        vec.erase(vec.begin() + 1);
    
        cout << "Vector after erasing second element: ";
        for (int num : vec) {
            cout << num << " ";
        }
        cout << endl;
    
        // 2~4 번째 요소 제거 (index 1~3)
        vec.erase(vec.begin() + 1, vec.begin() + 4);
    
        cout << "Vector after erasing range: ";
        for (int num : vec) {
            cout << num << " ";
        }
        return 0;
    }
    // output
    // Vector after erasing second element: 10 30 40 50
    // Vector after erasing range: 10 50
    

 

Map

  • 키-값 쌍이 하나의 타입이 됨
  • 키 값을 기준으로 데이터가 자동 정렬
  • 중복된 키값 허용 x
#include <iostream>
#include <map>

using namespace std;

int main() {
    // map 선언 및 값 추가
    map<int, string> myMap;
    myMap[5] = "E";
    myMap[2] = "B";
    myMap[8] = "H";
    myMap[1] = "A";
    myMap[3] = "C";

    // map 내용 출력
    cout << "Map의 내용 (키 값 기준으로 자동 정렬):" << endl;
    for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {
        cout << it->first << ": " << it->second << endl;
    }

    return 0;
}

 

  • insert()
    • make_pair를 통해 키-값 쌍을 만들고 이를 insert를 만들어서 추가
  • find()
    • 특정 키값이 존재하는지 확인 가능
  • size()
    • 맵에 키-값 쌍의 개수를 반환
  • clear()
    • map에 저장되어있는 모든 원소를 삭제

 

이렇게 각 코드 상황에 맞게 적절한 메소드를 사용하면 좋을 것 같고, 이런 메소드가 있었구나~ 하면 될 것 같다!

2차원 벡터는 아직 조금 어렵게 느껴지는데 코드를 계속 짜봐야 빨리 적응할 수 있을 것 같다