[STL/C++] STL 알고리즘 컨테이너

6 분 소요

STL algorithm container

stl의 알고리즘 컨테이너는 크게 7가지로 나뉜다. 각 알고리즘들에 대한 설명은 여기 알고리즘 관련된 것들을 정리하는 내 깃허브 리포지토리에 있다.

원소를 수정하지 않는 알고리즘

적으면서 외우자!

알고리즘 설명(p는 구간 [b,e)의 반복자)
p = adjacent_find(b,e) p는 구간의 원소 중 *p == *(p+1)인 첫 원소를 가리키는 반복자
p = adjacent_find(b,e,f) p는 구간의 원소 중 f(*p, *(p+1))이 참인 첫 원소를 가리키는 반복자
n = count(b,e,x) n은 구간의 원소 중 x 원소의 개수
n = count_if(b,e,f) n은 구간의 원소 중 f(*p)가 참인 원소의 개수
equal(b,e,b2) 두 구간의 원소가 모두 같은가
equal(b,e,b2,f) 두 구간의 모든 원소가 f(*p, *q)를 만족하는가
p = find(b,e,x) p는 구간에서 x와 같은 첫 원소의 반복자
p = find_end(b,e,b2,e2) p는 첫 번째 구간의 순차열 중 두 번째 구간의 순차열과 일치하는 순차열 첫 원소의 반복자
p = find_end(b,e,b2,e2,f) p는 첫 번째 구간의 순차열 중 두 번째 구간의 순차열과 f를 만족하는 순차열 첫 원소의 반복자
p = find_first_of(b,e,b2,e2) p는 첫 번재 구간에서 두 번째 구간의 원소 중 같은 원소가 발견된 첫 원소의 반복자
p = find_first_of(b,e,b2,e2,f) p는 첫 번째 구간의 원소 중 두 번째 구간의 원소와 f를 만족하는 첫 원소의 반복자
p = find_if(b,e,f) p는 구간에서 f(*p)를 만족하는 첫 원소를 가리키는 반복자
f = for_each(b,e,f) 구간의 모든 원소에 f를 적용한다. f를 다시 되돌려 준다
lexicographical_compare(b,e,b2,e2) 첫 번째 구간의 순차열이 두 번째 구간의 순차열보다 작다면 true
lexicographical_compare(b,e,b2,e2,f) 첫 번째 구간의 순차열이 두 번째 구간의 순차열보다 작다면 true, 해당 순차열은 f를 만족
k = max(a,b) k는 둘 중 더 큰 것
k = max(a,b,f) k는 둘 중 더 큰 것. 이 때 큰 것은 f(a,b)를 적용
p = max_element(b,e) p는 구간에서 가장 큰 원소의 반복자
p = max_element(b,e,f) p는 구간에서 가장 큰 원소의 반복자. 이때 비교는 f를 사용
k = min(a,b) k는 둘 중 더 작은 것
k = min(a,b,f) k는 둘 중 더 작은 것. 이 때 작은 것은 f(a,b)를 사용
p = min_element(b,e) p는 구간에서 가장 작은 원소의 반복자
p = min_element(b,e,f) p는 구간에서 가장 작은 원소의 반복자. 이때 비교는 f를 사용
pair(p,q) = mismatch(b,e,b2) (p,q)는 두 구간에서 !(*p==*q)인 첫 원소를 가리키는 반복자의 쌍
pair(p,q) = mismatch(b,e,b2,f) (p,q)는 두 구간에서 !f(*p,*q)가 참인 첫 원소를 가리키는 반복자의 쌍
p = search(b,e,b2,e2) p는 첫 번째 구간의 순차열 중 두 번째 구간의 순차열과 일치하는 순차열 첫 원소의 반복자
p = search(b,e,b2,e2,f) p는 첫 번째 구간의 순차열 중 두 번째 구간의 순차열과 f가 적용되는 순차열 첫 원소의 반복자
p = search_n(b,e,n,x) p는 구간의 원소 중 x값이 n개 연속한 첫 원소의 반복자
p = search_n(b,e,n,x,f) p는 구간의 원소 중 f(*p,x)가 참인 값이 n개 연속한 첫 원소의 반복자

원소를 수정하는 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
p = copy(b,e,t) 구간의 원소를 [t,p)로 모두 복사
p = copy_backward(b,e,t) 구간의 원소를 마지막 원소로부터 [p,t)로 모두 복사
fill(b,e,x) 구간의 모든 원소를 x로 채운다
fill_n(b,n,x) 구간 [b, b+n)의 모든 원소를 x로 채운다
f = for_each(b,e,f) 구간의 모든 원소에 f(*p)동작을 적용, f를 되돌려준다
generate(b,e,f) 구간의 모든 원소를 f()로 채운다
generate_n(b,n,f) 구간의 모든 원소를 f()로 채운다
iter_swap(p,q) 반복자가 가리키는 *p*q의 원소를 교환한다
p = merge(b,e,b2,e2,t) 정렬된 순차열 둘을 [t, p)로 합병 정렬한다
p = merge(b,e,b2,e2,t,f) 정렬된 순차열 둘을 [t, p)로 합병 정렬한다. f로 비교
replace(b,e,x,x2) 구간의 x인 원소를 x2로 수정한다
replace(b,e,f,x2) 구간에서 f가 참인 원소를 x2로 수정
p = replace_copy(b,e,t,x,x2) 구간의 x인 원소를 x2로 수정하여 [t,p)로 복사
p = replace_copy(b,e,t,f,x2) 구간에서 f가 참인 원소를 x2로 수정하여 [t,p)로 복사
swap(a, b) a와 b를 교환한다
swap_ranges(b,e,b2) 구간의 원소와 구간 [b2, b2+(e-b))의 원소를 교환한다
p = transform(b,e,t,f) 구간의 모든 원소를 f(*p)하여 두 번째 구간에 저장한다. p는 저장된 마지막 원소의 반복자이다
p = transform(b,e,b2,t,f) 두 구간의 모든 원소를 f하여 t로 시작하는 구간에 저장한다. p는 저장된 마지막 원소의 반복자이다

제거 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
p=remove(b,e,x) 구간의 순차열을 x원소가 남지 않도록 덮어쓰기로 이동한다. 알고리즘 수행 후 순차열은 [b,p)가 된다
p=remove(b,e,f) 구간의 순차열을 f(*p)가 참인 원소가 남지 않도록 덮어쓰기로 이동한다. 알고리즘 수행 후 순차열은 [b,p)가 된다
p=remove_copy(b,e,t,x) 구간의 순차열에서 *p==x가 아닌 원소만 순차열 [t,p)에 복사한다
p=remove_copy_if(b,e,t,f) 구간의 순차열에서 f(*p)가 참이 아닌 원소만 순차열에 복사한다
p=unique(b,e) 구간의 순차열을 인저반 중복원소가 남지 안게 덮어쓰기로 이동한다. 알고리즘 수행 후 p는 마지막 원소를 가리킨다
p=unique(b,e,f) 구간의 순차열을 f(*p)가 참인 인접한 중복 원소가 남지 않게 덮어쓰기로 이동한다. 알고리즘 수행 후 순차열은 [b,p)가 된다
p=unique_copy(b,e,t) 구간의 순차열에서 인접한 중복 원소가 아닌 원소를 두 번째 순차열에 복사한다
p=unique_copy(b,e,t,f) 구간의 순차열에서 f(*p)가 참인 인접한 중복 원소가 아닌 원소를 두 번째 순차열에 복사한다

변경 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
bool = next_permutation(b,e) 구간의 순차열을 사전순 다음 순열이 되게 한다. 마지막 순열이라면 bool은 false
bool = next_permutation(b,e,f) 구간의 순차열을 사전순 다음 순열이 되게 한다. 비교에 f를 사용, 마지막 순열일 경우 bool은 false
bool = prev_permutation(b,e) 구간의 순차열을 사전순 이전 순열이 되게 한다. 첫 순열일 경우 bool은 false
bool = prev_permutation(b,e,f) r구간의 순차열을 사전순 이전 순열이 되게 한다. 비교에 f를 사용, 첫 순열일 경우 bool은 false
p = partition(b,e,f) 구간의 순차열 중 f(*p)가 참인 원소는 [b,p)의 순차열에, 거짓인 원소는 [p,e)의 순차열로 분류한다
random_shuffle(b,e) 구간의 순차열을 랜덤으로 뒤섞는다
random_shuffle(b,e,f) 구간의 순차열을 f를 랜덤기로 하여 뒤섞는다
reverse(b,e) 구간의 순차열을 뒤집는다
p = reverse_copy(b,e,f) 구간의 순차열을 뒤집어 목적지 순차열 [t,p)에 복사
rotate(b,m,e) 구간의 순차열을 왼쪽으로 회전한다
p = rotate_copy(b,m,e,t) 구간의 순차열을 왼쪽으로 회전시켜 목적지 순차열에 복사
stable_partition(b,e,f) partition알고리즘과 같고 원소의 상대적 순서를 유지

정렬 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
p = partition(b,e,f) 구간의 순차열 중 f(*p)가 참인 원소는, [b,p)의 순차열에 거짓인 원소는 그 뒤로 분류
stable_partition(b,e,f) partition알고리즘과 같고 원소의 상대적인 순서를 유지한다
make_heap(b,e) 힙을 생성하고 구간의 순차열을 힙 구조로 변경한다
make_heap(b,e,f) 힙을 생성하고 구간의 순차열을 힙 구조로 변경한다, f는 조건자로 비교에 사용한다
push_heap(b,e,f) 힙에 원소를 추가한다, f는 조건자로 비교에 사용한다
push_heap(b,e) 힙에 원소를 추가한다
pop_heap(b,e) 힙에서 원소를 제거한다
pop_heap(b,e,f) 힙에서 원소를 제거한다 f는 조건자로 비교에 사용한다
sort_heap(b,e) 힙을 정렬한다. 구간의 순차열을 힙 구조를 이용하여 정렬한다
sort_heap(b,e,f) 힙을 정렬한다 구간의 순차열을 힙 구조를 이용하여 정렬한다. f는 조건자로 비교에 사용한다
nth_element(b,m,e) 구간의 원소 중 m-b개 만큼 선별된 원소를 [b,m)순차열에 놓이게 한다
nth_element(b,m,e,f) 구간의 원소 중 m-b개 만큼 선별된 원소를 [b,m)순차열에 놓이게 한다. f는 조건자로 비교에 사용한다
sort(b,e) 퀵 정렬을 기반으로 정렬
sort(b,e,f) 퀵 정렬을 기반으로 정렬, f를 비교에 사용
partial_sort(b,m,e) 힙 정렬을 기반으로 정렬 구간의 원소 중 m-b개 만큼의 상위 원소를 정렬
partial_sort(b,m,e,f) 힙 정렬을 기반으로 정렬 구간의 원소 중 m-b개 만큼의 상위 원소를 정렬, f는 조건자로 비교에 사용한다
partial_sort_copy(b,e,b2,e2) 힙 정렬을 기반으로 정렬, 구간의 원소 중 e2-b2개의 원소만 정렬하여 복사한다
partial_sort_copy(b,e,b2,e2,f) 힙 정렬을 기반으로 정렬, 구간의 원소 중 e2-b2개의 원소만 정렬하여 복사한다, f는 조건자로 비교에 사용한다

정렬된 범위 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
binary_search(b,e,x) 구간의 순차열에 x와 같은 원소가 있는가
binary_search(b,e,x,f) 구간의 순차열에 x와 같은 원소가 있는가, f를 비교에 사용
includes(b,e,b2,e2) 두 번째 구간의 모든 원소가 첫 번째 구간에도 있는가
p = lower_bound(b,e,x) p는구간의 순차열에서 x와같은 첫 원소의 반복자
p = lower_bound(b,e,x,f) p는구간의 순차열에서 x와같은 첫 원소의 반복자, f를 비교에 사용
p = upper_bound(b,e,x) p는 구간의 순차열에서 x보다 큰 원소의 반복자
p = upper_bound(b,e,x,f) p는 구간의 순차열에서 x보다 큰 원소의 반복자, f를 비교에 사용
pair(p1,p2) = equal_range(b,e,x) 구간 [p1,p2)의 순차열은 구간의 순차열에서 x와같은 원소의 구간이다. [lower_bound(),upper_bound())의 순차열과 같다
pair(p1,p2) = equal_range(b,e,x) 구간 [p1,p2)의 순차열은 구간의 순차열에서 x와같은 원소의 구간이다. [lower_bound(),upper_bound())의 순차열과 같다, f를 비교에 사용
p = merge(b,e,b2,e2,t) 첫 번째 구간의 순차열과 두 번째 구간의 순차열을 합쳐 [t,p)에 저장
p = merge(b,e,b2,e2,t,f) 첫 번째 구간의 순차열과 두 번째 구간의 순차열을 합쳐 [t,p)에 저장, f는 비교에 사용
inplace_merge(b,m,e) 정렬된 [b,m)순차열과 [m,e)순차열을 [b,e)순차열로 합친다
inplace_merge(b,m,e,f) 정렬된 [b,m)순차열과 [m,e)순차열을 [b,e)순차열로 합친다, f는 비교에 사용
p = set_union(b,e,b2,e2,t) 두 순차열의 합집합, [t,p)에 저장
p = set_union(b,e,b2,e2,t,f) 두 순차열의 합집합, [t,p)에 저장, f는 비교에 사용
p = set_intersection(b,e,b2,e2,t) 두 순차열의 교집합, [t,p)에 저장
p = set_intersection(b,e,b2,e2,t,f) 두 순차열의 교집합, [t,p)에 저장, f는 비교에 사용
p = set_difference(b,e,b2,e2,t) 두 순차열의 차집합, [t,p)에 저장
p = set_difference(b,e,b2,e2,t,f) 두 순차열의 차집합, [t,p)에 저장, f는 비교에 사용
p = set_symmetric_difference(b,e,b2,e2,t) 두 구간의 순차열을 정렬된 대칭 차집합으로 [t,p)에 저장
p = set_symmetric_difference(b,e,b2,e2,t,f) 두 구간의 순차열을 정렬된 대칭 차집합으로 [t,p)에 저장, f는 비교에 사용

수치 알고리즘

알고리즘 설명(p는 구간 [b,e)의 반복자)
x2 = accumulate(b,e,x) x2는 x를 초깃값으로 시작한 구간[b,e) 순차열 원소의 합
x2 = accumulate(b,e,x,f) x2는 x를 초깃값으로 시작한 구간[b,e) 순차열 원소의 누적, f를 누적에 사용
x2 = inner_product(b,e,b2,x) x2는 x를 초깃값으로 시작한 구간 [b,e)와 구간 [b2,,b2+e-b)의 내적이다
x2 = inner_product(b,e,b2,x,f1,f2) x2는 x를 초깃값으로 시작한 구간 [b,e)와 구간 [b2,,b2+e-b)의 모든 원소끼리 f2연산 후 f1연산으로 총 연산한 결과다
p = adjaent_differene(b,e,t) 구간의 인접 원소와의 차를 두 번째 구간에 저장한다
p = adjacent_difference(b,e,t,f) 구간의 인접 원소와의 차를 두 번째 구간에 저장한다, f를 연산에 사용
p = partial_sum(b,e,t) 구간의 현재 원소까지의 합을 두 번째 구간에 저장한다
p = partial_sum(b,e,t,f) 구간의 현재 원소까지의 연산을 두 번째 순차열에 저장한다. f를 연산에 사용한다

카테고리:

업데이트:

댓글남기기