std::allocator
클래스 템플릿은 STL 에서 사용되는 기본 할당기이다. 기본 할당자는 상태가 없다.
즉, 모든 할당자는 상호 교환 가능하고 동일하게 비교되며 동일한 할당자 유형의 다른 인스턴스가 할당한 메모리를 할당 해제할 수 있다.
일반적으로 동적 메모리 관리는 new
와 delete
사용하는 것이 편하고 효율적이지만 컨테이너를 직접 구현하고 사용하는 경우 std::allocator<T>
를 사용하면 표준 라이브러리와 유사한 인터페이스를 구현하기 용이하다.
allocator 는 memory 헤더 안에 구현되어있으며, new 를 사용해서 구현됐다.
std::allocator<T>
구성과 사용 방법은 간단하다. 객체를 정의하고 원하는 크기로 allocate 한 후 사용한다. 요소가 기본자료형이 아닌 경우 std::destroy
를 이용하여 각 요소의 소멸자를 호출한다. 그리고 마지막으로 deallocate를 하면 된다.
int main()
{
// define alloc
std::allocator<std::string> alloc;
const size_t size = 5;
// allocate
auto begin = alloc.allocate(size);
auto end = begin + size;
// destroy elements
std::destroy(begin, end);
// deallocate
alloc.deallocate(begin, size);
return EXIT_SUCCESS;
}
C++에서 이터레이터는 컨테이너 내의 요소들을 반복적으로 탐색하는 데 사용되는 객체이다. 일반적으로 포인터 형식이며, 포인터 연산자를 사용하여 요소에 접근할 수 있다.
이터레이터는 STL 과 함께 사용되어 컨테이너에서 요소를 탐색하고 조작하는 데 사용된다. 다양한 종류가 있는데 다음과 같다.
vector 컨테이너는 Random Access Iterator
를 사용하며, list 컨테이너는 Bidirectional Iterator
를 사용한다. 이러한 이터레이터의 종류를 파악하고, 컨테이너의 종류에 맞게 사용하여야 한다.
#include <iostream>
#include <vector>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << ' ';
}
return 0;
}
이 코드에서 vec.begin()
과 vec.end()
는 각각 벡터의 시작과 끝을 가리키는 이터레이터이며, *it
는 현재 이터레이터가 가리키는 요소를 나타낸다.