ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] STL 컨테이너 멤버 타입 특징
    C++/C++ STL 2024. 11. 16. 22:11

    STL Container 정의

    STL (Standard Template Library) 컨테이너는 C++ 표준 템플릿 라이브러리에서 제공하는 자료 구조이며, 템플릿 클래스다. 데이터 구조를 효율적으로 사용하고 코드를 단순화하는데 필수적이다. 이를 이해한다면, 더 빠르고 안정적인 프로그램을 개발할 수 있다.

     

    STL 컨테이너는 데이터 저장방식과 성능 요구사항에 따라 다음과 같이 분류할 수 있다.

    - 빠른 임의 접근: std::vector, std::deque

    - 삽입/삭제가 빈번: std::list, std::forward_list

    - 정렬된 데이터: std::set, std::map

    - 빠른 검색:std::unordered_set, std::unordered_map

    - 특정 구조: std::stack, std::queue, std::priority_queue

     

    이러한 STL 컨테이너는 내부에서 사용되는 타입을 명확하게 정의하기 위해 멤버 타입 (member type)를 제공한다. 이 멤버 타입들은 컨테이너를 사용할 때, 코드 가독성을 올리면서 일반적인 프로그래밍을 지원한다.

     

    - value_type: 컨테이너에 저장되는 요소의 타입이다. 예를 들어, std::vector<int>의 경우, value_type은 int다.

    - reference: value_type에 대한 참조타입이다. 예를 들어,  std::vector<int>의 reference는 int&가 된다.

    - const_reference: 상수 value_type에 대한 참조타입이다. 예를 들어, std::vector<int>의 const_reference는 const int&가 된다.

    - iterator: 컨테이너의 반복자 타입이다. 컨테이너 요소에 접근하기 위해 사용된다.

    - const_iterator: 상수 컨테이너에 대한 반복자 타입이다. const_iterator는 요소를 읽을수만 있으며, 수정할 수 없다.

    - difference_type: 반복자 간의 차이를 나타내는 타입이다. 반복자의 거리 계산에서 사용된다.

    - size_type: 컨테이너의 크기를 표현한다. 주로 size() 메서드 반환타입으로 사용된다.

     

    STL Container 멤버 변수 사용 예시 (reference)

    STL 컨테이너의 멤버 변수는 다음 코드처럼 사용가능하다.

    #include <iostream>
    
    
    #include <iostream>
    #include <vector>
    
    template <typename Container>
    typename Container::reference getFirstElement(Container& container) {
        return container.front();  // 첫 번째 요소의 참조 반환
    }
    
    int main() {
        std::vector<int> vec = { 1, 2, 3, 4, 5 };
        getFirstElement(vec) = 10;  // 첫 번째 요소를 10으로 변경
        std::cout << vec[0] << std::endl;  // 출력: 10
        return 0;
    }

     

    위 코드에서 getFirstElement 함수 템플릿은 Container타입의 reference를 반환한다. 그리고 그 reference값은 Container의 첫번째 값이다. 실제로 위 코드 동작시, std::vector<int> vec의 첫번째 요소가 1에서 10으로 바뀌었기 때문에, 10을 출력하게 된다.

     

    STL Container 멤버 변수 사용 예시 (Iterator)

    다음은 반복자 Iterator 사용 예시이다.

    #include <iostream>
    #include <iterator>
    #include <vector>
    
    template <typename Iterator>
    void printDistance(Iterator first, Iterator last) {
        typename std::iterator_traits<Iterator>::difference_type dist = last - first;
        std::cout << "Distance: " << dist << std::endl;
    }
    
    int main() {
        std::vector<int> vec = { 10, 20, 30, 40, 50 };
        printDistance(vec.begin(), vec.end());  // 출력: Distance: 5
        return 0;
    }

     

    위 예제에서 std::iterator_traits<Iterator>::difference_type은 전달된 반복자 타입에 맞는 difference_type를 추론하는데 사용된다. std::iterator_traits는 반복자의 특성을 추출할 때, 사용되는 템플릿 클래스다. difference_type은 반복자 간의 거리를 나타내는데 사용된다.

     

    멤버 타입을 사용하면 특정 컨테이너에 종속되지 않는 유연한 코드 작성이 가능하다. 예를 들어, std::list, std::deque와 같은 다른 컨테이너 타입에서도 value_type, iterator, reference 등의 멤버 타입을 사용할 수 있다.

     

    STL 컨테이너 difference_type 예시

    'C++ > C++ STL' 카테고리의 다른 글

    [C++] Concepts 의미와 사용 방법  (2) 2024.09.22
Designed by Tistory.