[C++] C++의 표준 템플릿 라이브러리(STL)에 관하여
STL의 개념
STL은 C++에서 제공하는 템플릿 기반의 라이브러리로, 자료 구조(컨테이너), 알고리즘, 반복자(iterator)를 포함합니다.
템플릿을 사용하기 때문에 다양한 데이터 타입에 대해 동일한 코드를 사용할 수 있다는 장점이 있습니다.
STL의 구성 요소
STL은 크게 세 가지 주요 구성 요소로 이루어져 있습니다.
- 컨테이너(Containers): 데이터를 저장하는 객체입니다. 배열, 리스트, 벡터, 맵 등 다양한 종류의 컨테이너가 제공됩니다.
- 알고리즘(Algorithms): 컨테이너에 저장된 데이터를 처리하는 함수 템플릿입니다. 정렬, 검색, 삭제, 복사 등 다양한 알고리즘이 제공됩니다.
- 반복자(Iterators): 컨테이너의 요소를 순회하는 객체입니다. 포인터와 유사한 역할을 하며, 알고리즘과 컨테이너를 연결하는 역할을 합니다.
컨테이너(Containers)
다양한 컨테이너들이 제공되며, 각각의 특징과 용도가 다릅니다.
- 시퀀스 컨테이너(Sequence Containers): 요소들이 특정 순서로 저장됩니다.
vector
: 동적 배열. 요소에 빠르게 접근 가능 (임의 접근). 끝에서 삽입/삭제가 빠름.deque
(Double-Ended Queue): 양쪽 끝에서 삽입/삭제가 빠른 큐.list
: 이중 연결 리스트. 중간 삽입/삭제가 빠름. 임의 접근은 느림.forward_list
: 단일 연결 리스트.list
보다 메모리 효율적.array
: 고정 크기 배열. C 스타일 배열과 유사하지만 추가적인 기능 제공.
- 연관 컨테이너(Associative Containers): 키(key)를 사용하여 요소에 접근하며, 요소들은 특정 기준에 따라 정렬되어 저장됩니다.
set
: 중복된 요소를 허용하지 않는 집합. 요소들은 오름차순으로 정렬됨.multiset
: 중복된 요소를 허용하는 집합.map
: 키-값 쌍을 저장하는 컨테이너. 키는 중복될 수 없음. 요소들은 키를 기준으로 오름차순으로 정렬됨.multimap
: 키-값 쌍을 저장하는 컨테이너. 키의 중복을 허용함.
- 컨테이너 어댑터(Container Adapters): 기존 컨테이너를 사용하여 특정 인터페이스를 제공합니다.
stack
: LIFO(Last-In, First-Out) 스택.queue
: FIFO(First-In, First-Out) 큐.priority_queue
: 우선순위 큐. 요소들은 우선순위에 따라 정렬됨.
알고리즘(Algorithms)
<algorithm>
헤더 파일에 정의되어 있으며, 반복자를 통해 컨테이너의 요소에 접근하여 다양한 작업을 수행합니다.
std::sort
: 정렬std::find
: 검색std::copy
: 복사std::remove
: 삭제std::transform
: 요소 변환std::accumulate
: 누적std::for_each
: 각 요소에 함수 적용
반복자(Iterators)
컨테이너의 요소를 가리키는 객체로, 포인터와 유사하게 동작합니다.
begin()
: 컨테이너의 첫 번째 요소를 가리키는 반복자를 반환end()
: 컨테이너의 마지막 요소 바로 다음을 가리키는 반복자를 반환.++
: 다음 요소로 이동--
: 이전 요소로 이동*
: 반복자가 가리키는 요소에 접근
STL의 장점
- 재사용성: 템플릿 기반이므로 다양한 데이터 타입에 대해 동일한 코드를 사용할 수 있습니다.
- 효율성: 잘 구현된 알고리즘과 자료 구조를 제공하여 높은 성능을 보장합니다.
- 표준화: C++ 표준의 일부이므로 모든 C++ 컴파일러에서 사용할 수 있습니다.
- 생산성 향상: 직접 구현할 필요 없이 제공되는 기능을 사용하므로 개발 시간을 단축할 수 있습니다.
주의사항
- 적절한 컨테이너 선택: 문제에 맞는 컨테이너를 선택하는 것이 중요합니다. 예를 들어, 빈번한 삽입/삭제가 일어나는 경우
vector
보다는list
를 사용하는 것이 좋습니다. - 반복자 무효화: 컨테이너의 요소를 추가하거나 삭제할 때 반복자가 무효화될 수 있으므로 주의해야 합니다.
코드
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 9, 4};
// 정렬
std::sort(numbers.begin(), numbers.end());
// 출력
for (int num : numbers) { // 범위 기반 for 루프
std::cout << num << " ";
}
std::cout << std::endl;
// 특정 값 찾기
auto it = std::find(numbers.begin(), numbers.end(), 8);
if (it != numbers.end()) {
std::cout << "Found 8 at index: " << std::distance(numbers.begin(), it) << std::endl;
}
return 0;
}