변경 알고리즘 함수는 컨테이너를 변경하지 않으며, 컨테이너의 지정된 범위에서 요소의 값만을 변경할 수 있는 함수이다. STL에서 제공하는 대표적인 변경 알고리즘 함수에는 copy(), swap(), transform()이 있다.
copy()
#include <algorithm>
template <class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);
first부터 last 전까지의 모든 원소들을 d_first부터 시작하는 곳에 복사한다.
swap(), swap_range()
#include <algorithm>
template <class T>
void swap (T& a, T& b)
swap의 경우 해당 변수에 있는 값들을 서로 바꿔주는 역할을 한다.
#include <algorithm>
template< class ForwardIt1, class ForwardIt2 >
ForwardIt2 swap_ranges( ForwardIt1 first1, ForwardIt1 last1, ForwardIt2 first2 );
swap_ranges는 특정 범위의 값들을 다른 연속된 메모리 공간의 값들과 바꾸어 주는 역할을 한다.
first부터 last 전까지의 원소들을 first2부터 시작하는 곳에 복사한다.
transform()
#include <algorithm>
template <class InputIt, class OutputIt, class UnaryOperation>
OutputIt transform(InputIt first1, InputIt last1, OutputIt d_first, UnaryOperation unary_op); // (1)
template <class InputIt1, class InputIt2, class OutputIt, class BinaryOperation>
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, OutputIt d_first, BinaryOperation binary_op); // (2)
범위 내의 원소들 각각에 대해 인자로 전달할 함수를 실행한 후, 그 결과를 d_first에서부터 쭉 기록한다.
for_each 함수와 하는 일이 거의 동일한데, 다른 점은
- for_each의 경우 원소를 수정하지 않는다. 함수의 리턴값 역시 무시된다.
- transform의 경우 원소를 수정하게 된다. 함수의 리턴값으로 해당 원소가 바뀐다.
next_permutation()
#include <algorithm>
template< class BidirIt > bool next_permutation( BidirIt first, BidirIt last );
template< class BidirIt, class Compare > bool next_permutation( BidirIt first, BidirIt last, Compare comp );
해당 컨테이너에 다음 순열이 존재한다면 그 컨테이너의 원소를 해당 순열 순서로 바꾸고 true를 반환하고, 다음 순열이 없다면 false를 반환한다.
next_permutation을 사용할 때 주의할 점은
- 오름차순으로 정렬된 값을 가진 컨테이너로만 사용가능하다.
- defalt로 <를 사용해 순열을 생성한다. 즉 오름차순으로 순열을 생성한다.
- 중복이 있는 원소들은 중복을 제외하고 순열을 만든다.
※ 순열을 이용한 조합 구하기
조합에서는 원소 r개를 뽑기만 하면 되기 때문에 순서가 중요하지 않다.
배열 s의 n개의 원소 중에서 r개의 원소를 택하는 방법은 다음과 같다.
- 크기가 n인 배열 temp를 만들어 r개의 원소는 1로, (n - r)개의 원소는 0으로 초기화한다.
- temp의 모든 순열을 구한다.
- temp의 순열에서 원소값이 1인 인덱스만 배열 s에서 가져온다.
temp에서 1이 있는 자리의 원소는 포함하고 0이 있는 자리의 원소는 미포함하는 것이다.
next_permutation을 사용하면 오름차순으로 정렬되기 때문에, 조합은 내림차순으로 출력된다. 하지만 prev_permutation을 쓰면 모든 조합의 경우의 수를 오름차순으로 출력할 수 있다.
'Language > C++' 카테고리의 다른 글
[C++] PS할 때 전역변수를 써야 하는 경우 (0) | 2022.04.28 |
---|---|
[C++] STL - 정렬 알고리즘 함수 (sort, stable_sort, binary_search) (0) | 2021.11.07 |
[C++] STL - 읽기 알고리즘 함수 (find, for_each) (0) | 2021.11.06 |
[C++] STL - pair, tuple (0) | 2021.11.06 |
[C++] cout, cin 실행 속도 높이기 (시간 초과 해결법) (0) | 2021.11.04 |