C++ 초급 - 11. 표준 라이브러리(STL) (5 - std::algorithm (정렬 및 탐색 알고리즘))
2025. 2. 22. 17:51ㆍ프로그래밍 언어/C++
📌 11.5 std::algorithm (정렬 및 탐색 알고리즘)
C++ 표준 라이브러리(STL)의 <algorithm> 헤더는 정렬, 탐색, 반복 처리 등의 다양한 알고리즘을 제공하여 코드의 효율성과 가독성을 향상시킨다.
특히 std::sort, std::find, std::for_each 등은 자주 사용되는 핵심 알고리즘이다.
📌 1. std::sort를 활용한 정렬
🔹 (1) std::sort 기본 정렬
- 배열 또는 벡터의 요소를 오름차순으로 정렬.
- 기본적으로 operator<을 사용하여 정렬.
💡 예제: std::sort를 활용한 정렬
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {5, 3, 1, 4, 2};
std::sort(v.begin(), v.end()); // 오름차순 정렬
std::cout << "정렬된 벡터: ";
for (int num : v) std::cout << num << " ";
std::cout << std::endl;
return 0;
}
🔹 출력 결과
정렬된 벡터: 1 2 3 4 5
💡 설명
- std::sort(v.begin(), v.end()) → 오름차순 정렬 수행.
- 퀵소트 기반으로 평균 시간 복잡도 O(N log N).
📌 2. std::find를 활용한 원소 탐색
🔹 (1) std::find 기본 사용법
- 특정 값을 찾아 해당 위치의 반복자를 반환.
- 값이 없으면 end()를 반환.
💡 예제: std::find를 활용한 탐색
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {10, 20, 30, 40, 50};
auto it = std::find(v.begin(), v.end(), 30);
if (it != v.end()) {
std::cout << "값 30을 찾았습니다!" << std::endl;
} else {
std::cout << "값 30이 없습니다!" << std::endl;
}
return 0;
}
🔹 출력 결과
값 30을 찾았습니다!
💡 설명
- std::find(v.begin(), v.end(), 30) → 값 30을 찾고 위치 반환.
- 존재하지 않는 값이면 v.end() 반환.
📌 3. std::for_each를 활용한 반복 처리
🔹 (1) std::for_each 기본 사용법
- 컨테이너의 모든 요소에 특정 작업을 수행.
💡 예제: std::for_each를 사용한 출력
#include <iostream>
#include <vector>
#include <algorithm>
void print(int n) {
std::cout << n << " ";
}
int main() {
std::vector<int> v = {1, 2, 3, 4, 5};
std::cout << "벡터 요소: ";
std::for_each(v.begin(), v.end(), print);
std::cout << std::endl;
return 0;
}
🔹 출력 결과
벡터 요소: 1 2 3 4 5
💡 설명
- std::for_each(v.begin(), v.end(), print) → 모든 요소를 print 함수로 출력.
📌 4. std::reverse, std::min_element, std::max_element
🔹 (1) std::reverse (컨테이너 뒤집기)
💡 예제: std::reverse 사용
std::vector<int> v = {1, 2, 3, 4, 5};
std::reverse(v.begin(), v.end()); // 요소 순서 뒤집기
🔹 (2) std::min_element (최솟값 찾기)
💡 예제: std::min_element 사용
auto minIt = std::min_element(v.begin(), v.end());
std::cout << "최솟값: " << *minIt << std::endl;
🔹 (3) std::max_element (최댓값 찾기)
💡 예제: std::max_element 사용
auto maxIt = std::max_element(v.begin(), v.end());
std::cout << "최댓값: " << *maxIt << std::endl;
📌 5. 람다 표현식을 활용한 커스텀 정렬
🔹 (1) std::sort에 람다를 사용하여 내림차순 정렬
💡 예제: std::sort를 활용한 내림차순 정렬
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> v = {5, 3, 1, 4, 2};
std::sort(v.begin(), v.end(), [](int a, int b) {
return a > b; // 내림차순 정렬
});
std::cout << "내림차순 정렬된 벡터: ";
for (int num : v) std::cout << num << " ";
std::cout << std::endl;
return 0;
}
🔹 출력 결과
내림차순 정렬된 벡터: 5 4 3 2 1
💡 설명
- 람다 표현식을 사용하여 정렬 기준을 커스텀 (a > b → 내림차순).
- 함수를 따로 선언하지 않고 즉시 정의하여 사용 가능.
📌 6. 정리
알고리즘 | 설명 |
std::sort | 배열 또는 벡터를 정렬 (O(N log N)) |
std::find | 특정 값을 찾아 위치 반환 (O(N)) |
std::for_each | 컨테이너의 모든 요소에 특정 연산 수행 |
std::reverse | 컨테이너의 요소 순서를 반대로 변경 |
std::min_element | 컨테이너에서 최솟값 찾기 |
std::max_element | 컨테이너에서 최댓값 찾기 |
람다를 활용한 정렬 | std::sort에서 커스텀 정렬 기준 적용 가능 |