표준 템플릿 라이브러리(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++ 프로그래밍에서 매우 유용한 도구로, 코드의 재사용성과 유지 보수성을 높여줍니다. 다양한 템플릿화된 구조체와 함수들을 이용하여 복잡한 데이터 처리와 알고리즘 작업을 간편하게 할 수 있습니다.
