▲ C++ 코딩을 어느정도 배우다보면 STL이 등장하기 시작합니다.
Standard Template Library, 표준 템플릿 라이브러리로, 만들어져있는 알고리즘이나 컨테이너를 가져다 쓰는것입니다
먼저 Stackoverflow에서 무엇을 써야 좋은지 판단해주는 그래프를 가져왔습니다
원본 : https://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container
▼한글로 간단히 번역해보았습니다
그래프만 따라가도 어느 목적일시 무엇을 사용가능한지 판단 가능하긴 하지만, 제가 사용했었던
실 예시 몇몇개만 나열해보겠습니다
Vector
가장 먼저, 그리고 가장 흔히 접하게 되는 컨테이너입니다. 딱히 특수한 목적이 있지 않다면
보통 배열처럼 키값 걱정할 필요 없고, 접근 및 사용이 손쉬운 백터부터 고려를 합니다.
최대 총알 갯수가 정해져있지 않은 총알을 발사하는 횡/종스크롤 슈팅게임서 동적으로
변하는 총알 갯수 및 행동을 제어하려고 담아둘 때, 업데이트 될 모든 적을 담아주는 컨테이너가 필요할 때,
검색할 목적은 없고 순차적으로 모두 접근해서 특정 상태를 확인해야 할 때 Vector를 사용했었습니다.
장점 : 인덱스로 빠른 접근, 컨테이너 끝에서 삽입삭제 빠름, 랜덤액세스 무난
단점 : 키값없음, 중간 삽입삭제 느림
List
자료가 메모리 공간상에 연속적으로 있지 않은 대신, 원소가 본인 이전,이후에 대한 포인터를 보유하고 있는
컨테이너 입니다. 위 언급한 벡터에 비해 삽입삭제가 빨라서 잦은 삭제가 일어날 때 사용합니다
예전에 A* 알고리즘에서 타일을 노드화 시켜 리스트에 담아두고, 열린노드들을 하나씩 소거해나가며
길을 찾을때 List 컨테이너를 사용했었습니다. 또한 일정 갯수를 맞추면 팡팡 터지고 사라져버리는 퍼즐류 게임에서도
리스트를 사용하면 더 유용할 것으로 보입니다.
장점 : 삽입삭제가 빠름
단점 : 원소 연결을 위한 추가 메모리 공간 필요, 순회속도 느림, 랜덤액세스 불가능
Map
벡터 다음으로 제가 자주 사용하는 컨테이너입니다. 이진트리를 이용한 구조로,
위 vector, list와 달리 값을 저장시 키를 쥐어주어 검색에 용이합니다.
SceneManager나 ImageManager같이, 키값으로 뭔가를 검색 후 반환 받아야 할
상황서 유용하게 사용하였었습니다.
장점 : 이진트리를 이용한 빠른 검색, 넣자마자 정렬, 키값 보유
단점 : 작은 규모에 적합하지 않음, [ ]오퍼레이터의 위험성
Set
굳이 키값이 필요하진 않지만 중복은 없었으면 할 때 사용하는 컨테이너입니다.
중복이 없기에 자료 그 자체가 키나 마찬가지입니다.
저의 경우엔 연산에 의해 나온 타일들 중 중복이 없었어야 할 상황에서 사용해본적 있습니다
사용처가 너무 구체적이라 조금 애매해서 위 상황 말곤 사용해본적은 없긴 합니다.
장점 : 빠른 검색, 값이 곧 키값이라 중복을 허용치 않음. 넣자마자 정렬
단점 : 작은 규모에 비적합, map과 마찬가지로 insert로 입력이 더 안전
Priority Queue
자료를 넣기만 해도 알아서 정의된 비교연산자에 의해 우선순위를 판단해
꺼내 쓰는 순서가 달라지는 컨테이너입니다.
사실 위에 A*에서 list를 썼다고 언급했지만 더 적합한 컨테이너는 Priority Queue였습니다.
자료가 들어가서 나오는 순서가 중요도에 따라 배치 가능하기 때문이라
굳이 list를 sort 돌린 후 나오는 값으로 작업할 수고를 건너 뛰어도 되었기 때문입니다.
자료들을 넣어서 휴리스틱값이 낮은걸 우선적으로 꺼내는 상황서 다음에 사용해볼 예정입니다.
Stack
선입후출 방식의 컨테이너 입니다. 먼저 들어간 자료가 나중에 나오는 구조로
메뉴 UI등에 타고타고 들어가서 뭔가를 한 후에 이전 행동으로 빠져나올때라던지
함수 콜 스택 순서등에 사용됩니다.
예전에 길찾기 알고리즘서 깊이우선탐색으로 BackTracking을 달성하고자 할때
재귀방법과 stack컨테이너를 사용한 적이 있습니다.
Queue
선입선출 방식의 컨테이너입니다. 먼저 들어간 자료가 먼저 나오는 구조의 컨테이너로
길찾기 알고리즘서 너비 우선 탐색을 구현할 때 Queue 컨테이너를 사용했습니다.
'정보들 > C,C++ 관련' 카테고리의 다른 글
inline 함수 vs 매크로 함수 (0) | 2020.06.23 |
---|---|
C++의 캐스팅 4가지 (0) | 2020.06.23 |
bool vs BOOL? (0) | 2020.06.23 |
push_back vs emplace_back (0) | 2020.06.23 |
assert를 디버깅에 활용 (0) | 2020.06.23 |