C++ STL: 4장 - STL 알고리즘
2025. 2. 25. 22:40ㆍ프로그래밍 언어/C++ STL
4.1 알고리즘의 기본 개념
STL의 알고리즘(Algorithm)은 컨테이너의 데이터를 효율적으로 처리하기 위한 함수 템플릿 모음입니다. 데이터의 검색, 정렬, 변환 등 다양한 작업을 수행할 수 있으며, 이터레이터(iterator)를 통해 모든 종류의 컨테이너와 함께 사용할 수 있습니다.
알고리즘의 주요 특징
- 컨테이너 독립적 설계
- 템플릿 기반의 제네릭 프로그래밍
- 최적화된 성능 (O(1), O(log n), O(n), O(n log n) 등 다양한 시간 복잡도)
4.2 알고리즘의 종류
4.2.1 검색 알고리즘
데이터를 찾고 검색하는 알고리즘입니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// find: 값 찾기
auto it = std::find(numbers.begin(), numbers.end(), 3);
if (it != numbers.end()) {
std::cout << "찾은 값: " << *it << std::endl;
}
return 0;
}
4.2.2 정렬 알고리즘
데이터를 정렬하는 알고리즘입니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {5, 2, 8, 1, 9};
// 기본 정렬 (오름차순)
std::sort(numbers.begin(), numbers.end());
// C++11 이상: 사용자 정의 정렬 (람다 함수 사용)
std::sort(numbers.begin(), numbers.end(),
[](int a, int b) { return a > b; }); // 내림차순
// 부분 정렬
std::partial_sort(numbers.begin(), numbers.begin() + 3, numbers.end());
return 0;
}
4.2.3 변환 알고리즘
데이터를 변환하거나 수정하는 알고리즘입니다.
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::vector<int> result(numbers.size());
// transform: 각 요소 변환
std::transform(numbers.begin(), numbers.end(), result.begin(), [](int x) { return x * 2; });
// replace: 값 교체
std::replace(numbers.begin(), numbers.end(), 3, 30); // 3을 30으로 교체
return 0;
}
4.2.4 수치 알고리즘
수학적 연산을 수행하는 알고리즘입니다.
#include <iostream>
#include <vector>
#include <numeric>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 합계 계산
int sum = std::accumulate(numbers.begin(), numbers.end(), 0);
// 부분합 계산
std::vector<int> partial_sums(numbers.size());
std::partial_sum(numbers.begin(), numbers.end(), partial_sums.begin());
return 0;
}
4.3 알고리즘과 이터레이터
STL 알고리즘은 이터레이터(iterator)를 통해 컨테이너와 상호작용합니다. 이를 통해:
- 코드 재사용성 향상
- 일관된 인터페이스 제공
- 다양한 컨테이너 지원
예제
#include <iostream>
#include <vector>
#include <list>
#include <algorithm>
int main() {
// vector에서 사용
std::vector<int> vec = {1, 2, 3};
auto vec_it = std::find(vec.begin(), vec.end(), 2);
// list에서 동일한 알고리즘 사용
std::list<int> lst = {1, 2, 3};
auto lst_it = std::find(lst.begin(), lst.end(), 2);
return 0;
}
실전 활용 팁
- 가능하면 STL 알고리즘을 사용하세요. 직접 구현하는 것보다 효율적이고 안전합니다.
- C++11 이상에서는 람다 함수(lambda function)로 알고리즘을 커스터마이즈할 수 있습니다:
std::sort(vec.begin(), vec.end(), [](const int& a, const int& b) { return a > b; }); // 내림차순 정렬
- 알고리즘 선택 시 성능을 고려하세요:
- 정렬된 데이터: binary_search 사용 (시간 복잡도: O(log n))
- 안정적 정렬: stable_sort 사용 (시간 복잡도: O(n log n))
- 부분 정렬만 필요: partial_sort 사용 (시간 복잡도: O(n log k), k는 정렬할 요소 수)
'프로그래밍 언어 > C++ STL' 카테고리의 다른 글
C++ STL: 6장 - STL 컨테이너 성능 비교와 활용 사례 (0) | 2025.02.26 |
---|---|
C++ STL: 5장 - STL과 메모리 관리 (0) | 2025.02.26 |
C++ STL: 3장 - STL 이터레이터 (0) | 2025.01.06 |
C++ STL: 2장 - STL 컨테이너 (0) | 2025.01.06 |
C++ STL: 1장 - STL의 이해 (0) | 2025.01.06 |