표준 템플릿 라이브러리(STL, Standard Template Library)은 C++의 중요한 구성 요소로, 다양한 데이터 구조와 알고리즘을 제공하는 템플릿화된 컨테이너와 함수들의 모음입니다. STL은 C++ 표준 라이브러리의 일부로 제공되며, 많은 편리한 기능들을 제공합니다. 여기에는 주요 컴포넌트들이 포함되어 있습니다:
주요 컴포넌트
- 컨테이너 (Containers)
- 시퀀스 컨테이너 (Sequence Containers): 벡터(vector), 리스트(list), 덱(deque), 배열(array), 큐(queue), 스택(stack) 등이 포함됩니다.
- 연관 컨테이너 (Associative Containers): 세트(set), 멀티세트(multiset), 맵(map), 멀티맵(multimap) 등이 있습니다.
- 반복자 (Iterators)
- 입력 반복자 (Input Iterators): 읽기만 가능한 반복자입니다.
- 출력 반복자 (Output Iterators): 쓰기만 가능한 반복자입니다.
- 전방향 반복자 (Forward Iterators): 읽기와 쓰기 모두 가능하지만 한 번만 전진할 수 있는 반복자입니다.
- 양방향 반복자 (Bidirectional Iterators): 전진과 후진이 모두 가능한 반복자입니다.
- 임의 접근 반복자 (Random Access Iterators): 임의의 위치로 접근이 가능한 반복자입니다.
- 알고리즘 (Algorithms)STL은 다양한 알고리즘을 제공합니다. 예를 들어 정렬(sort), 검색(search), 변형(transform), 집계(accumulate) 등의 알고리즘이 있습니다.
- 함수 객체 (Function Objects, Functors)함수 객체는 함수처럼 동작하는 객체로, STL의 알고리즘과 함께 사용됩니다. 주로
operator()
멤버 함수를 오버로딩하여 사용합니다. - 할당기 (Allocators)메모리 할당과 관련된 정책을 지정하는 객체로, 컨테이너에서 사용됩니다.
컨테이너(Container)
벡터(Vector)
- 동적 배열을 구현한 컨테이너입니다.
- 요소들이 메모리에 연속적으로 저장되며, 임의 접근 반복자(random access iterator)를 제공하여 요소에 빠르게 접근할 수 있습니다.
#include <vector> #include <iostream> int main() { // 정수를 저장하는 벡터 생성 std::vector<int> vec; // 벡터에 요소 추가 vec.push_back(1); vec.push_back(2); vec.push_back(3); // 벡터 순회 및 출력 for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
리스트(List)
- 이중 연결 리스트를 구현한 컨테이너입니다.
- 임의 위치에서 삽입과 삭제가 빠르며, 순차적 접근만 가능합니다.
#include <list> #include <iostream> int main() { // 정수를 저장하는 리스트 생성 std::list<int> lst; // 리스트에 요소 추가 lst.push_back(1); lst.push_back(2); lst.push_back(3); // 리스트 순회 및 출력 for (auto it = lst.begin(); it != lst.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
덱(Deque)
- 더블 엔디드 큐(Double-ended Queue)를 구현한 컨테이너입니다.
- 벡터와 비슷하지만 양쪽 끝에서 삽입과 삭제가 빠릅니다.
#include <deque> #include <iostream> int main() { // 정수를 저장하는 덱 생성 std::deque<int> deq; // 덱에 요소 추가 deq.push_back(1); deq.push_back(2); deq.push_front(3); // 덱 순회 및 출력 for (auto it = deq.begin(); it != deq.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
스택(Stack)
- 후입선출(LIFO, Last In First Out) 원칙에 따라 요소를 관리하는 컨테이너입니다.
- 요소의 삽입은
push
, 삭제는pop
으로 이루어집니다.
#include <stack> #include <iostream> int main() { // 정수를 저장하는 스택 생성 std::stack<int> stk; // 스택에 요소 추가 stk.push(1); stk.push(2); stk.push(3); // 스택 순회 및 출력 while (!stk.empty()) { std::cout << stk.top() << " "; stk.pop(); } std::cout << std::endl; return 0; }
큐(Queue)
- 선입선출(FIFO, First In First Out) 원칙에 따라 요소를 관리하는 컨테이너입니다.
- 요소의 삽입은
push
, 삭제는pop
으로 이루어집니다.
#include <queue> #include <iostream> int main() { // 정수를 저장하는 큐 생성 std::queue<int> que; // 큐에 요소 추가 que.push(1); que.push(2); que.push(3); // 큐 순회 및 출력 while (!que.empty()) { std::cout << que.front() << " "; que.pop(); } std::cout << std::endl; return 0; }
우선순위 큐(Priority Queue)
- 우선순위에 따라 요소를 관리하는 큐입니다.
- 디폴트로는 요소가 큰 순서대로 정렬되며,
std::less
를 사용하여 작은 요소가 우선순위를 갖도록 할 수 있습니다.
#include <queue> #include <iostream> int main() { // 정수를 저장하는 우선순위 큐 생성 std::priority_queue<int, std::vector<int>, std::less<int>> pq; // 우선순위 큐에 요소 추가 pq.push(3); pq.push(1); pq.push(2); // 우선순위 큐 순회 및 출력 while (!pq.empty()) { std::cout << pq.top() << " "; pq.pop(); } std::cout << std::endl; return 0; }
연관 컨테이너(Associative Containers)
맵(Map) 및 멀티맵(Multimap)
- 키-값 쌍으로 데이터를 관리하는 컨테이너입니다. 맵은 중복된 키를 허용하지 않지만, 멀티맵은 중복된 키를 허용합니다.
#include <map> #include <iostream> int main() { // 문자열을 키로, 정수를 값으로 갖는 맵 생성 std::map<std::string, int> m; // 맵에 요소 추가 m["one"] = 1; m["two"] = 2; m["three"] = 3; // 맵 순회 및 출력 for (auto it = m.begin(); it != m.end(); ++it) { std::cout << it->first << ":" << it->second << " "; } std::cout << std::endl; return 0; }
셋(Set) 및 멀티셋(Multiset)
- 정렬된 중복을 허용하지 않는 요소들의 집합을 관리하는 컨테이너입니다. 셋은 중복된 요소를 허용하지 않지만, 멀티셋은 중복된 요소를 허용합니다.
#include <set> #include <iostream> int main() { // 정수를 저장하는 셋 생성 std::set<int> s; // 셋에 요소 추가 s.insert(3); s.insert(1); s.insert(2); // 셋 순회 및 출력 for (auto it = s.begin(); it != s.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; return 0; }
알고리즘(Algorithms)
STL은 다양한 알고리즘을 제공하여 컨테이너에서 데이터를 처리하고 정렬하는 등의 작업을 할 수 있습니다. 여기에는 std::sort
, std::find
, std::transform
등이 포함됩니다.
#include <algorithm> #include <vector> #include <iostream> int main() { std::vector<int> vec = {3, 1, 4, 1, 5, 9, 2, 6, 5}; // 벡터 정렬 std::sort(vec.begin(), vec.end()); // 벡터 출력 std::cout << "정렬된 벡터: "; for (auto it = vec.begin(); it != vec.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // 특정 값 찾기 int key = 5; auto result = std::find(vec.begin(), vec.end(), key); if (result != vec.end()) { std::cout << key << "가 벡터에 있습니다." << std::endl; } else { std::cout << key << "가 벡터에 없습니다." << std::endl; } return 0; }
STL은 C++ 프로그래밍에서 매우 유용한 도구로, 코드의 재사용성과 유지 보수성을 높여줍니다. 다양한 템플릿화된 구조체와 함수들을 이용하여 복잡한 데이터 처리와 알고리즘 작업을 간편하게 할 수 있습니다.