-
C++ 표준 템플릿 라이브러리(STL)와 스마트 포인터c++ 2025. 2. 3. 21:07728x90
1. 표준 템플릿 라이브러리(STL)란?
**표준 템플릿 라이브러리(STL)**는 C++에서 제공하는 강력한 데이터 구조와 알고리즘의 집합입니다. STL은 크게 컨테이너(Containers), 반복자(Iterators), **알고리즘(Algorithms)**으로 구성됩니다.
(1) STL의 주요 구성 요소
- 컨테이너(Containers): 데이터를 저장하는 자료구조 (ex. vector, list, map, set)
- 반복자(Iterators): 컨테이너의 원소를 순회하는 도구
- 알고리즘(Algorithms): 정렬, 검색 등 다양한 알고리즘 제공
2. 주요 STL 컨테이너 사용법
(1) vector: 동적 배열
vector는 크기가 가변적인 동적 배열로, 가장 널리 사용되는 컨테이너 중 하나입니다.
#include <iostream> #include <vector> using namespace std; int main() { vector<int> numbers = {1, 2, 3, 4, 5}; // 요소 추가 numbers.push_back(6); // 요소 출력 for (int num : numbers) { cout << num << " "; } cout << endl; // 특정 요소 접근 cout << "첫 번째 요소: " << numbers[0] << endl; return 0; }
출력 결과:
1 2 3 4 5 6 첫 번째 요소: 1
(2) map: 키-값 쌍 저장
map은 키-값 쌍으로 데이터를 저장하는 연관 컨테이너입니다. 키를 기준으로 자동으로 정렬됩니다.
#include <iostream> #include <map> using namespace std; int main() { map<string, int> ageMap; // 요소 삽입 ageMap["Alice"] = 30; ageMap["Bob"] = 25; // 요소 출력 for (auto& pair : ageMap) { cout << pair.first << ": " << pair.second << endl; } return 0; }
출력 결과:
Alice: 30 Bob: 25
(3) set: 중복 없는 집합
set은 중복을 허용하지 않는 데이터를 저장하는 컨테이너입니다.
#include <iostream> #include <set> using namespace std; int main() { set<int> uniqueNumbers = {1, 2, 3, 2, 4, 5}; // 요소 출력 for (int num : uniqueNumbers) { cout << num << " "; } cout << endl; return 0; }
출력 결과:
1 2 3 4 5
3. STL 알고리즘 사용법
STL은 다양한 알고리즘을 제공합니다. 예를 들어, 정렬, 검색, 변환 등의 기능을 쉽게 사용할 수 있습니다.
(1) 정렬(sort)
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> numbers = {5, 2, 9, 1, 5, 6}; // 오름차순 정렬 sort(numbers.begin(), numbers.end()); // 요소 출력 for (int num : numbers) { cout << num << " "; } cout << endl; return 0; }
출력 결과:
1 2 5 5 6 9
4. 스마트 포인터(Smart Pointers)란?
스마트 포인터는 C++에서 메모리 관리를 자동화하는 포인터입니다. 이를 통해 메모리 누수(memory leak)를 방지할 수 있습니다.
(1) 주요 스마트 포인터 종류
- unique_ptr: 하나의 객체를 단독으로 소유하는 포인터
- shared_ptr: 여러 포인터가 동일한 객체를 공유할 수 있음 (참조 카운팅)
- weak_ptr: shared_ptr과 함께 사용되며, 순환 참조를 방지
(2) unique_ptr 사용법
#include <iostream> #include <memory> using namespace std; int main() { unique_ptr<int> ptr = make_unique<int>(10); cout << "값: " << *ptr << endl; // unique_ptr은 복사 불가능, 이동만 가능 unique_ptr<int> ptr2 = move(ptr); cout << "이동 후 값: " << *ptr2 << endl; return 0; }
출력 결과:
값: 10 이동 후 값: 10
(3) shared_ptr 사용법
#include <iostream> #include <memory> using namespace std; int main() { shared_ptr<int> ptr1 = make_shared<int>(20); shared_ptr<int> ptr2 = ptr1; // 참조 카운트 증가 cout << "값: " << *ptr1 << endl; cout << "참조 카운트: " << ptr1.use_count() << endl; return 0; }
출력 결과:
값: 20 참조 카운트: 2
(4) weak_ptr 사용법
weak_ptr은 순환 참조(Circular Reference)를 방지하기 위해 사용됩니다.
#include <iostream> #include <memory> using namespace std; int main() { shared_ptr<int> sharedPtr = make_shared<int>(30); weak_ptr<int> weakPtr = sharedPtr; cout << "참조 카운트: " << sharedPtr.use_count() << endl; if (auto locked = weakPtr.lock()) { cout << "weak_ptr이 가리키는 값: " << *locked << endl; } else { cout << "객체가 더 이상 존재하지 않습니다." << endl; } return 0; }
출력 결과:
참조 카운트: 1 weak_ptr이 가리키는 값: 30
728x90'c++' 카테고리의 다른 글
C++ 네트워크 프로그래밍과 소켓 통신 (0) 2025.02.04 C++ 멀티스레딩 프로그래밍과 동기화 기법 (0) 2025.02.03 C++ 객체 지향 프로그래밍: 연산자 오버로딩과 템플릿 (0) 2025.02.02 C++ 객체 지향 프로그래밍: 상속과 다형성 (0) 2025.02.01 C++ 객체 지향 프로그래밍 (OOP) 시작하기 (0) 2025.02.01