목차

개요
     1. STL vs C++ std - 이름에 관한 이야기
     2. 훑어보기

기본
     3. pair: 두 타입을 묶는 구조체
     4. tuple: 다수의 타입을 묶는 구조체 (예정)
     5. Allocators - 컨테이너의 동적 할당과 해제
     6. Iterators - 접근 인터페이스

선형 컨테이너 (Sequencial Containers)
     7. array: 정적 배열 컨테이너
     8. vector: 가변 길이 배열 컨테이너
     9. insert vs emplace vs push
    10. list_forward: 단일 연결리스트 컨테이너
    11. list: 이중 연결리스트 컨테이너
    12. deque: 끝단에서 빠른 자료구조

트리 컨테이너 (Associative Containers)
    13. 내부 구조 - red-black tree (예정)
    14. 집합 컨테이너 - set, multiset
    15. 사전형 컨테이너 - map, multimap

해시 컨테이너 (Unordered Associative Containers)
     16. 내부 구조 - hash table (예정)
     17. unordered_set: hash를 이용한 set
     18. unordered_map: hash를 이용한 map (예정)


 

Intro

   C++를 다시 공부하면서 느끼는 것은 프로그램을 바라보는 관점이 다른 언어들과는 차이가 있다는 것이다. 다른 언어에는 없는 복잡한 문법이라던가, 평소에는 추상화되어서 생각해 본 적 없던 것들에 대해서 고려해야 한다든가 하는 어려움이 있었다.

   이런 다름 중 하나는 표준 라이브러리에 구현된 자료구조의 사용법이다. 처음으로 언어에서 제공하는 자료구조를 사용하기 위해서 그 사용법 자체를 공부해야겠다고 느꼈다. 예를 들어 집합에서 값을 검색하는데 aSet.fine("안녕") != aSet.end()와 같은 맥락을 이해할 수 없는 사용법인데, 이에 대한 이유를 알기 어려웠다.

   이때, 가장 쉽게 이해할 수 있는 방법은 내부 구조를 확인해 그 맥락을 파악하는 것이라고 생각한다. 다행히 ms에서 자신들이 구현한 std를 오픈소스로 공개하기도 했고, C++ 자체가 디버깅 모드에서 메모리가 어디에 얼마큼 할당되고 관리되는지 알 수 있어, 큰 어려움은 없었다.

   이러한 방법으로 내부 구현에 대해서 이해하고, 사용법에 익숙해질 수 있었다. 다만, 단순히 사용법에만 너무 시간을 많이 써버린 것이 문제였다. 이 아까운 마음을 어떻게 할까 고민하다가 알게 된 내용들을 정리해서 공유하면 좋겠다는 결론에 도달했다.


 

다루는 것

   자료구조와 알고리즘 기능들을 사용하기 위해서 꼭 알아야 하는 부분은 크게 세 부분으로 나누어진다고 생각한다.

  • Containers : 자료구조와 관련 연산으로 데이터를 보관
  • Algorithms : 정렬, 탐색과 같이 자주 사용하는 알고리즘 제공
  • Iterators : 컨테이너 내부 데이터에 대한 접근 및 제어 방법을 제공

   대부분의 내용은 cppreference마이크로소프트 공식 문서, 그리고 MS에서 직접 github에 공개한 레포만을 참고하려고 했다. 애매하다고 느끼거나, 잘 모르겠는 내용은 이해를 명확하게 하기 위해서 Visual Studio msvc++에서 테스트해보거나, ChatGPT의 도움을 빌렸다. 그 외의 참고한 자료는 아티클마다 따로 표기했다.

   또, 23년 8월 기준으로 Visual Studio에서 사용할 수 있는 C++의 가장 높은 버전은 C++20였다. 따라서, C++20을 기본 잡고 정리했고, C++20에 추가된 기능을 따로 표기하지 않았다. 컨테이너는 array, list&forward_list, vector, deque, adapters, set/map(multi), unordered_set/map 정도만 정리했다.


 

대상

   간단한 자료구조의 이론들은 거의 생략했는데, 다른 걸 설명하는 것만으로도 에너지를 다 써버렸기 때문이다. 그래서, 자료구조를 모르시는 분들은 아마 글을 이해하기 힘들 수 있다. 다른 언어로 알고리즘 문제를 풀다가 C++로 전환하신 분들이나, 자료구조의 이론들을 공부한 다음 사용을 위해서 표준의 사용법을 공부하려는 분들에게는 도움이 될 수 있을 거라고 생각하고, 그랬으면 좋겠다.