<aside> <img src="/icons/list_gray.svg" alt="/icons/list_gray.svg" width="40px" />
목차
</aside>
<aside> <img src="/icons/dialogue_blue.svg" alt="/icons/dialogue_blue.svg" width="40px" />
STL이란?
구성 요소
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| 컨테이너 (Container) | 데이터를 저장하고 관리하는 객체 | vector, list, map, set, queue, stack 등 |
| 반복자 (Iterator) | 컨테이너의 원소를 순회하고 접근하는 포인터와 유사한 객체 | begin(), end(), iterator++, *iterator |
| 알고리즘 (Algorithm) | 컨테이너의 원소들을 처리하는 일반화된 함수들 | sort(), find(), count(), reverse() |
기존 Python의 데이터 구조와 친숙하기 때문에, 적응을 좀 더 빠르게 하기 위해서 Python과 비교하면서 알아보도록 하자.
vector는 C++의 동적 배열 컨테이너로, Python의 리스트(list)와 매우 유사한 자료구조이다. 메모리가 연속적으로 할당되어 있어 임의 접근이 빠르며, 끝에서의 삽입/삭제가 효율적이다.
vector(C++) vs list(Python)
C++
vector<int> vec = {1, 2, 3};
vec.push_back(4); // 추가
cout << vec[0] << endl; // 출력: 1
Python
py_list = [1, 2, 3]
py_list.append(4) # 추가
print(py_list[0]) # 출력: 1
공통점
std::vector**와 Python의 **list**는 모두 동적 배열로 구현되어 있으며, 크기가 자동으로 조정된다.차이점
C++ std::vector |
Python list |
|
|---|---|---|
| 데이터 타입 | 동일한 타입만 저장 가능 | 다양한 타입 저장 가능 |
| 메모리 관리 | 연속된 메모리 블록에 저장 (캐시 친화적) | 포인터 배열로 구현 (각 요소가 힙에 저장됨) |
| 성능 | 더 빠름 (타입 고정 및 컴파일 타임 최적화) | 느림 (동적 타입 및 런타임 오버헤드) |
| 타입 검사 | 정적 타입 검사 | 동적 타입 검사 |
list는 C++의 이중 연결 리스트 컨테이너로, 각 노드가 이전/다음 노드를 가리키는 포인터를 가지고 있다. 임의 위치에서의 삽입/삭제가 효율적이지만, 임의 접근은 처음부터 순차적으로 탐색해야 하므로 느리다는 특징이 있다.
list(C++) vs list(Python)
C++
list<int> lst = {1, 2, 3};
lst.push_back(4); // 끝에 추가
for (int val : lst)
cout << val << " ";
// 출력: 1 2 3 4
Python
py_list = [1, 2, 3]
py_list.append(4) # 끝에 추가
for val in py_list:
print(val, end=" ")
# 출력: 1 2 3 4
공통점
차이점
C++ std::list |
Python list |
|
|---|---|---|
| 구현 방식 | 이중 연결 리스트 (Doubly Linked List) | 동적 배열 |
| 임의 접근 지원 | 지원하지 않음 ([] 연산자 사용 불가) |
지원 ([] 연산자 사용 가능) |
| 삽입/삭제 성능 | 중간 삽입/삭제가 빠름 | 중간 삽입/삭제가 느림 |
| 순회 성능 | 순회가 느림 (포인터 이동 필요) | 순회가 빠름 (연속된 메모리 블록) |
list(C++) vs vector(C++)
Python의 데이터 구조에 익숙한 나머지, C++의 리스트와 벡터가 혼동되긴 한다. 두 컨테이너는 어떤 차이가 있을까? 알아보도록 하자.
차이점
std::vector |
std::list |
|
|---|---|---|
| 메모리 구조 | 연속적인 배열 | 더블 링크드 리스트 |
| 임의 접근 | 지원 $O(1)$ | 지원하지 않음 $O(n)$ |
| 중간 삽입/삭제 | 느림 $O(n)$ | 빠름 $O(1)$ |
| 끝에서 삽입/삭제 | 빠름 $O(1)$ | 빠름 $O(1)$ |
| 캐시 효율성 | 높음 | 낮음 |
| 정렬 | std::sort() 사용 |
멤버 함수 sort() 사용 |
| 추가 메모리 | 없음 | 각 노드마다 포인터 저장 |
<aside> <img src="/icons/code_blue.svg" alt="/icons/code_blue.svg" width="40px" />
</aside>
<aside> <img src="/icons/code_blue.svg" alt="/icons/code_blue.svg" width="40px" />
</aside>
그러면, 언제 어떤 걸 사용하면 될까?
vector