반응형
STL(Standard Template Library)이란?
→ 프로그램에 필요한 자료구조와 알고리즘을 Template로 제공하는 라이브러리
- STL은 C++을 위한 라이브러리로 알고리즘, 컨테이너, 함수자, 반복자 4가지로 구성되어 있다.
STL 의 구성요소
- Container객체를 저장하는 객체, 자료구조 라고도 한다. 클래스 템플릿으로 구현되어있다.container는 크게 sequence container, associative container로 나뉜다.
- Sequence Container 의 종류 : array (C++ 11), vector, list, deque
- Associative Container 의 종류 : set, multiset, map, multimap
- Iterator포인터와 비슷한 개념으로 컨테이너의 원소를 가리키고, 가리키는 원소에 접근하여 다음 원소를 가리키는 기능. 순회
- Algorithm정렬, 삭제, 검색, 연산 등을 해결하는 일반화된 방법을 제공하는 함수 템플릿(sort, binary_search 등등).
- Function Object함수처럼 동작하는 객체로 operator() 연산자를 오버로딩 한 객체.컨테이너와 알고리즘 등에 클라이언트 정책을 반영하게 한다.
- Container Adaptor구성요소의 인터페이스를 변경해 새로운 인터페이스를 갖는 구성요소로 변경.
C++ 컨테이너 종류
→ C++에서 컨테이너는 데이터를 저장하고 관리하는데 사용되는 자료 구조를 나타낸다. 이러한 컨테이너는 다양한 유형의 데이터를 저장하고 처리하기 위한 다양한 기능을 제공한다. C++ 표준 라이브러리에는 다양한 종류의 컨테이너 클래스가 포함디어 있으며, 각 컨테이너는 특정 사용 사례에 맞게 설계되었다.
컨테이너가 엄청 많기 때문에 나중에 하나씩 정리하면서 해보자.
- 배열(Array)
- 연속적인 메모리 공간에 원소를 저장한다.
- 크기가 고정되어 있으며 원소의 삽입/삭제가 비효율적이다.
- std::array는 C++11부터 표준 라이브러리에 추가되었다.
- 정적 크기의 배열로, 동일한 데이터 유형의 요소를 순차적으로 저장한다.
- 벡터(Vector)
- 동적 배열로, 크기가 동적으로 조정되며, 요소를 추가하거나 제거할 수 있다.
- std::vector는 표준 라이브러리에서 제공된다.
- 메모리 할당과 해제를 자동으로 처리하여 편리하다.
- 임의 위치에 원소를 빠르게 삽입하거나 삭제할 수 있다.
- std::vector는 C++ 표준 라이브러리에서 제공된다.
- 리스트(List)
- 이중 연결 리스트로, 요소 추가 및 제거가 빠르지만 임의 접근은 느리다.
- 원소들은 메모리에 연속적으로 저장되지 않습니다.
- std::list는 C++ 표준 라이브러리에서 제공된다.
- 스택(stack)
- 후입선출(LIFO) 방식의 자료 구조로, 주로 요소를 쌓는 데 사용된다.
- std::stack 클래스를 사용하여 구현할 수 있다.
- 가장 최근에 추가된 원소가 가장 먼저 제거된다.
- 큐(Queue)
- 선입선출(FIFO)방식의 자료 구조로, 주로 요소를 대기열로 처리하는 데 사용된다.
- std::queue 클레스를 사용하여 구현 가능하다.
- 맵(Map) 및 해시맵(Unordered Map)
- 키-값 쌍을 저장하는 자료 구조로, 각 키는 유일해야 하며 빠른 키를 사용한 검색이 가능하다.
- std::map, std::unordered_map을 사용할 수 있다.
- 세트(Set)
- 유일한 요소만 저장하는 자료 구조로, 중복된 요소가 없도록 유지된다.
- std::set, std::unordered_set을 사용 가능하다.
→ 이러한 컨테이너 클래스들은 C++ 표준 라이브러리에서 제공되며, 효울적인 데이터 저장 및 검색을 위한 기능을 제공한다.
→ 개발자는 자신의 요구 사항에 따라 적절한 컨테이너를 선택하고 사용 가능하다.
C++ 반복자(iterator)
→ C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다. 따라서 라이브러리가 효과적으로 동작한다는 것을 보장할 수 있다는 장점이 있다.
- 즉, 포인터와 상당히 비슷하며, 컨테이너에 저장되어 있는 원소들을 참조할 때 사용된다,
- 추상적으로 말하자면, 반복자란 컨테이너에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용하는, 일종의 포인터와 비슷한 객체라고 할 수 있다.
- 알고리즘 마다 각기 다른 방식으로 컨테이너를 훑어가기 때문에, 반복자에도 여러가지 종류가 있게 됨.
반복자의 선언
- 컨테이너에는 vector, list, stack 등이 오는 것이다.
- <T>는 컨테이너의 자료형을 말한다.
std::컨테이너<T>::iterator 변수이름
vector이고 int형인 반복자의 예제
std::vector<int>::iterator
반복자의 성질
- 컨테이너와 컨테이너 안의 있는 요소를 구별
- 요소의 값 확인
- 컨테이너 안에 있는 요소들 간에 이동할 수 있는 연산 제공
- 컨테이너가 효과적으로 처리할 수 있는 방식으로 가용한 연산들을 한정
반복자 구간
→ 구간이란 컨테이너에 담긴 값들의 시퀀스를 나타낸다.
- 구간은 반복자 한 쌍으로 나타내며, 이 반복자들이 각각 시퀀스의 시작과 끝을 가리킨다.
- 반복자는 특정 값을 지정하는데 사용될 수 있으며, 연속적인 메모리 영역을 두 개의 포인터로 나타내듯이 한 쌍의 반복자는 값들의 구간을 설정하는데 사용될 수 있다.
- 그러나 반복자의 경우 설정되는 범위 내의 값들이 반드시 물리적으로 연속적이어야할 필요가 없다. 단, 이 두개의 반복자가 같은 컨테이너로부터 생성된 것이어야 하며, 두 번째 반복자는 첫 번째 반복자 이후에 와야함.
- 그리고 첫 번째 반복자에서 두 번째 반복자까지 차례로 컨테이너 내부의 원소들을 처리하게 되므로 논리적인 연속성을 지닐 수 있다.
- 포인터는 널(NULL) 값을 가질 수 있는데 이는 아무것도 가리키지 않는다는 의미이다. 반복자 또한 어떤 값도 가리키지 않는 반복자를 참조하는 것은 에러를 발생.
end()함수는 끝이 아니다
→ 컨테이너를 다룰 때 자주 쓰이는 end()라는 멤버 함수는 컨테이너의 마지막 원소를 가리키는 것이 아님.
- end()가 가리키고 있는 것은 맨 마지막 원소의 바로 다음 번 원소임.
- 이러한 반복자를 past-the-end 반복자라고 부른다.(중점을 지나쳐버린 곳을 가리키는 반복자)
- end() 멤버 함수를 통해 얻어지는 반복자는 결과적으로 아무 의미가 없는 것을 가리키고 있는 것이며, 이 반복자가 가리키는 것을 참조하면 예상치 못한 오류 발생.
- 또한 아무 원소도 없는 컨테이너의 begin()과 end()는 같다.
반응형