1. 개요

<algorithm> 헤더는 C++ STL에서 다양한 범용 알고리즘 함수들을 제공합니다. 이들은 대부분 반복자 범위(예: [first, last))를 기반으로 작동하며, 시퀀스 컨테이너(vector, list, 등)에서 사용됩니다.

 #include <algorithm>

2. 분류별 주요 알고리즘

🔹 정렬 및 관련

함수 설명
sort(first, last) 오름차순 정렬
stable_sort(first, last) 안정 정렬
partial_sort(first, middle, last) 일부 정렬
nth_element(first, nth, last) n번째 원소를 그 위치에
is_sorted(first, last) 정렬 여부 확인
reverse(first, last) 역순 정렬
rotate(first, middle, last) 회전 (앞으로 당김)

🔹 탐색

함수 설명
find(first, last, val) 값 찾기
find_if(first, last, pred) 조건 만족하는 첫 값
find_end() 마지막 일치 시퀀스 찾기
find_first_of() 첫 일치 요소
binary_search(first, last, val) 이진 탐색 (정렬 필요)
lower_bound() / upper_bound() 범위 탐색
equal_range() 값이 들어갈 범위 쌍

🔹 비교

함수 설명
equal(first1, last1, first2) 두 시퀀스 비교
lexicographical_compare() 사전 순 비교
mismatch(first1, last1, first2) 처음 불일치 위치

🔹 복사 및 이동

함수 설명
copy(first, last, dest) 복사
copy_if() 조건 만족하는 요소만 복사
copy_n(first, n, dest) n개 복사
move(first, last, dest) 이동
swap_ranges() 범위 교환
fill(first, last, val) 범위 채우기
fill_n(dest, n, val) n개 채우기
generate() / generate_n() 함수로 값 생성

🔹 제거

함수 설명
remove(first, last, val) 값 제거 (재배치)
remove_if() 조건 만족 제거
unique(first, last) 중복 제거 (연속된 중복)
erase()와 함께 사용해야 실제 삭제 가능  

🔹 수정 및 변형

함수 설명
replace(first, last, old, new) 값 교체
replace_if() 조건 만족 값 교체
transform() 변환하여 저장
for_each() 각 요소에 함수 적용

🔹 집계 및 검사

함수 설명
count(first, last, val) 특정 값 개수
count_if() 조건 만족 개수
min(), max() 최소, 최대 값
min_element(), max_element() 최소, 최대 반복자
accumulate() (헤더 <numeric>) 합계 계산
all_of() / any_of() / none_of() 조건 검사

🔹 집합 연산 (정렬 필요)

함수 설명
set_union() 합집합
set_intersection() 교집합
set_difference() 차집합
set_symmetric_difference() 대칭차

🔹 기타

함수 설명
iota(first, last, val) (헤더 <numeric>) 연속된 값으로 채우기
next_permutation() / prev_permutation() 순열 생성
random_shuffle() / shuffle() 셔플

3. 예제 코드

 #include <iostream>
 #include <vector>
 #include <algorithm>
 using namespace std;
 
 int main() {
     vector<int> v = {5, 3, 1, 4, 2};
 
     sort(v.begin(), v.end());
     reverse(v.begin(), v.end());
 
     for_each(v.begin(), v.end(), [](int x) {
         cout << x << " ";
     });
     cout << endl;
 
     if (binary_search(v.begin(), v.end(), 3)) {
         cout << "Found 3" << endl;
     }
 
     return 0;
 }

4. 주의사항

  • 대부분의 알고리즘은 반복자 범위를 사용
  • 수정 알고리즘은 원본 컨테이너를 변경함
  • remove()erase()를 함께 사용하는 idiom은 중요
 v.erase(remove(v.begin(), v.end(), value), v.end());

글 이동

Comments