<aside> <img src="/icons/list_gray.svg" alt="/icons/list_gray.svg" width="40px" />

목차

</aside>

STL


<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


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

공통점

차이점

C++ std::vector Python list
데이터 타입 동일한 타입만 저장 가능 다양한 타입 저장 가능
메모리 관리 연속된 메모리 블록에 저장 (캐시 친화적) 포인터 배열로 구현 (각 요소가 힙에 저장됨)
성능 더 빠름 (타입 고정 및 컴파일 타임 최적화) 느림 (동적 타입 및 런타임 오버헤드)
타입 검사 정적 타입 검사 동적 타입 검사

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