allocator 와 iterator

😎·2023년 2월 24일
0

CPP

목록 보기
43/46

allocator

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;
}

iterator

C++에서 이터레이터는 컨테이너 내의 요소들을 반복적으로 탐색하는 데 사용되는 객체이다. 일반적으로 포인터 형식이며, 포인터 연산자를 사용하여 요소에 접근할 수 있다.

이터레이터는 STL 과 함께 사용되어 컨테이너에서 요소를 탐색하고 조작하는 데 사용된다. 다양한 종류가 있는데 다음과 같다.

  1. 무작위 접근 - Random access iterator
  2. 단방향 - Forward iterator
  3. 양방향 - Bidirectional iterator
  4. 입력 - Input iterator
  5. 출력 - Output iterator

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는 현재 이터레이터가 가리키는 요소를 나타낸다.


참고자료

profile
jaekim

0개의 댓글