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차원 벡터는 아직 조금 어렵게 느껴지는데 코드를 계속 짜봐야 빨리 적응할 수 있을 것 같다
'C++' 카테고리의 다른 글
[C++] Text RPG 몬스터 생성 로직 설계 (1) | 2025.01.13 |
---|---|
[C++] 컴파일러와 인터프리터? (1) | 2025.01.03 |
[C++] 유니크 포인터 (0) | 2024.12.31 |
[C++] 생성자와 소멸자 (0) | 2024.12.30 |
[C++] floating point exception (core dumped)에 대해 알아보자 (1) | 2024.12.27 |