반응형
C++ 개발의 생산성을 결정짓는 가장 중요한 요소는 무엇일까요? 바로 STL(Standard Template Library)을 얼마나 자유자재로 다루느냐입니다. STL은 검증된 데이터 구조와 알고리즘을 제공하여 개발자가 밑바닥부터 코드를 짤 필요가 없게 해줍니다.
이번 포스팅에서는 STL의 3대 구성 요소인 컨테이너, 반복자, 알고리즘을 체계적으로 정리하고 실전 예제를 살펴보겠습니다.

1. STL의 3대 핵심 요소
STL은 서로 긴밀하게 연결된 세 가지 요소로 구성됩니다.
- 컨테이너(Container): 데이터를 저장하는 객체 (예: vector, list, map)
- 반복자(Iterator): 컨테이너의 원소에 접근하는 포인터와 유사한 객체
- 알고리즘(Algorithm): 데이터를 처리하는 함수 (예: sort, find)
2. 컨테이너(Container) 종류와 특징
데이터를 어떤 방식으로 저장하고 관리할지에 따라 적절한 컨테이너를 선택해야 합니다.
시퀀스 컨테이너 (순서가 있는 저장)
- std::vector: 끝부분 요소 추가/삭제가 빠른 동적 배열 (가장 많이 사용됨)
- std::list: 연결 리스트 구조로, 중간 삽입/삭제가 빈번할 때 유리함
- std::deque: 앞과 뒤 양쪽에서 삽입/삭제가 빠름
연관 컨테이너 (키-값 구조)
- std::set: 중복을 허용하지 않고 자동으로 정렬됨
- std::map: (Key, Value) 쌍으로 저장하며 키를 기준으로 자동 정렬됨
컨테이너 선택 가이드 (시간 복잡도)
| 컨테이너 | 접근(Access) | 검색(Search) | 삽입/삭제(끝) |
| vector | $O(1)$ | $O(N)$ | $O(1)$ |
| list | $O(N)$ | $O(N)$ | $O(1)$ |
| map/set | $O(\log N)$ | $O(\log N)$ | $O(\log N)$ |
3. 주요 컨테이너 실전 예제
3.1 std::vector: 동적 배열의 정석
C++
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {5, 2, 8, 1, 9};
v.push_back(10); // 데이터 추가
// 정렬 (알고리즘 활용)
std::sort(v.begin(), v.end());
std::cout << "Vector 출력: ";
for (int n : v) std::cout << n << " "; // 범위 기반 for문
return 0;
}
3.2 std::map: 효율적인 데이터 검색
C++
#include <iostream>
#include <map>
#include <string>
int main() {
std::map<std::string, int> inventory;
inventory["Apple"] = 500;
inventory["Banana"] = 300;
// 데이터 탐색
if (inventory.find("Apple") != inventory.end()) {
std::cout << "Apple 가격: " << inventory["Apple"] << "원" << std::endl;
}
return 0;
}
4. 알고리즘(Algorithm) 활용하기
STL 알고리즘은 반복자(begin, end)를 통해 컨테이너에 접근합니다.
std::sort와 std::for_each
C++
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {3, 1, 4, 1, 5, 9};
// 오름차순 정렬
std::sort(nums.begin(), nums.end());
// 람다 식을 활용한 출력
std::cout << "정렬된 결과: ";
std::for_each(nums.begin(), nums.end(), [](int n) {
std::cout << n << " ";
});
return 0;
}
5. 결론: STL을 더 잘 쓰기 위한 팁
- 목적에 맞는 컨테이너 선택: 검색이 잦다면 map이나 unordered_map을, 단순 데이터 저장은 vector를 사용하세요.
- 알고리즘 적극 활용: 직접 for문을 돌려 정렬하거나 탐색하는 것보다 STL 알고리즘을 쓰는 것이 성능과 가독성 면에서 훨씬 우수합니다.
- Modern C++ 활용: auto 키워드와 람다(Lambda)를 곁들이면 STL 코드가 훨씬 간결해집니다.
C++ STL은 방대하지만, 자주 쓰이는 패턴 위주로 익히다 보면 코드의 질이 달라지는 것을 느끼실 겁니다. 질문이 있으시면 댓글로 남겨주세요!
반응형
'Core Programming > Modern C++ & System Design' 카테고리의 다른 글
| C++ 파일 입출력 완벽 가이드: 바이너리 파일 읽기/쓰기 및 포인터 제어 (0) | 2024.12.21 |
|---|---|
| C++ 예외 처리 완벽 가이드: try-catch-throw 문법과 실전 예제 (0) | 2024.12.20 |
| C++ 템플릿(Template) 완벽 정리: 함수·클래스 템플릿부터 특수화까지 (0) | 2024.12.20 |
| C++ 네임스페이스(Namespace) 사용법 총정리: 이름 충돌 방지와 모듈화 (0) | 2024.12.20 |
| C++ 연산자 오버로딩 완벽 정리: 복소수 예제로 배우는 연산자 재정의 (0) | 2024.12.19 |