-
[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