이 글에서는 C++ STL의 list::get_allocator() 함수가 어떻게 동작하는지, 그리고 그 문법과 실제 예제 코드를 통해 자세히 살펴보겠습니다.
STL에서 리스트(List)란?
리스트(List)는 시퀀스의 어느 위치에서든 상수 시간(O(1)) 안에 삽입과 삭제를 수행할 수 있는 자료 구조입니다. 리스트는 내부적으로 이중 연결 리스트(doubly linked list)로 구현되어 있으며, 비연속적인(non-contiguous) 메모리 할당을 허용합니다.
배열(array), 벡터(vector), 덱(deque)과 비교했을 때, 리스트는 컨테이너 내 임의의 위치에서 요소를 삽입·추출·이동하는 작업에서 훨씬 뛰어난 성능을 보여줍니다. 다만 리스트는 특정 요소에 대한 직접 접근(임의 접근)이 느리다는 단점이 있습니다.
리스트는 forward_list와 유사하지만, forward_list는 단일 연결 리스트(singly linked list)로 구현되어 있어 앞쪽(forward) 방향으로만 순회할 수 있다는 차이점이 있습니다.
list::get_allocator()란?
list::get_allocator()는 C++ STL에 내장된 함수로, <list> 헤더 파일에 선언되어 있습니다. 이 함수는 리스트 컨테이너가 사용하는 할당자(allocator)를 반환합니다. 쉽게 말해, 리스트 컨테이너 객체의 복사본을 반환하며, 이를 통해 해당 컨테이너와 동일한 방식으로 메모리를 직접 할당하거나 해제할 수 있습니다.
문법(Syntax)
list_container.get_allocator();
이 함수는 매개변수를 받지 않습니다.
반환 값(Return Value)
이 함수는 리스트 컨테이너 객체의 복사본(copy)을 반환합니다.
예제 1
/*
아래 코드에서는 C++ STL에 포함된 get_allocator를 사용하여
메모리를 할당한 후 배열에 값을 삽입합니다.
*/
#include <bits/stdc++.h>
using namespace std;
int main(void){
// 리스트 생성
list<int> myList;
int *ptr;
ptr = myList.get_allocator().allocate(4);
// 배열에 데이터 삽입
for(int i = 0; i < 4; i++)
ptr[i] = i;
// 데이터 출력
cout<<"elements of an array : ";
for (int i = 0; i < 4; i++)
cout << ptr[i] << " ";
}
실행 결과
위 코드를 실행하면 아래와 같은 출력이 생성됩니다.
elements of an array : 0 1 2 3
예제 2
/*
아래 코드에서는 <list> 헤더 파일을 포함한 뒤, C++ STL의 get_allocator를 사용하여
메모리를 할당하고 값을 저장한 후, 마지막에 deallocate로 메모리를 해제합니다.
*/
#include <iostream>
#include <list>
int main (){
std::list<int> myList;
int *ptr;
ptr = myList.get_allocator().allocate(5);
for(int i=0; i<5; ++i)
ptr[i]=i;
std::cout <<"elements of an array : ";
for (int i=0; i<5; ++i)
std::cout << ' ' << ptr[i];
myList.get_allocator().deallocate(ptr,5);
return 0;
}
실행 결과
위 코드를 실행하면 아래와 같은 출력이 생성됩니다.
elements of an array : 0 1 2 3 4
두 번째 예제처럼 allocate()로 할당한 메모리는 사용이 끝난 후 반드시 deallocate()를 호출하여 해제하는 것이 좋습니다. 이는 메모리 누수(memory leak)를 방지하는 안전한 프로그래밍 습관입니다.