728x90
reverse(first, last) 는 algorithm 라이브러리의 함수로 배열 등의 요소를 거꾸로 뒤집는 동작을 말합니다.
[first, last) first를 포함한 인덱스부터 last 바로 전 인덱스까지의 요소들을 거꾸로 뒤집습니다.
'인덱스'를 집어넣어야 하는 것이 핵심입니다.
배열
reverse(a, a+5); //a배열의 처음부터 끝까지 뒤집음 (a[5] 배열)
reverse(b+1, b+4); //b배열의 두번째 요소부터 네번째 요소까지 뒤집음 (b[5] 배열)
string, vector
reverse(str.begin(), str.end()); //string의 처음부터 끝까지 뒤집음
reverse(v.begin()+1, v.end()-1); //벡터의 두번째 요소부터 네번째 요소까지 뒤집음
string과 vector는 객체이므로 .begin(), .end() 함수로 인덱스에 접근합니다.
reverse의 원시함수 내부를 보면 다음과 같습니다.
template <class BidirectionalIterator>
void reverse(BidirectionalIterator first, BidirectionalIterator last) {
while((first != last) && first != --last){
std::iter_swap(first++, last);
}
}
"HelloWorld" 라는 문자열을 reverse(str.begin(), str.end()) 에 넣었다고 가정하였을 때,
- first : 맨 앞의 'H'를 가리킵니다.
- last : 마지막 'd'의 다음 위치를 가리킵니다.
- while((first != last) && first != --last) : last는 while문을 들어가면서 --가 되어 'd'를 가리킵니다.
- iter_swap(first, last) -> iter_swap(H, d)로 'H'와 'd' 요소가 바뀌게 됩니다.
- iter_swap(first++, last) 이었기 때문에 first가 가리키는 것이 두번째 요소인 'e'가 됩니다.
- 다시 while 문에서 --last 로 인하여 last가 가리키는 요소가 맨 마지막에서 두번째인 'l'이 됩니다.
- (이하 반복)
이런 방식으로 last와 first가 만나는 시점에 while문이 false가 되어 reverse 함수가 끝나게 됩니다.
BidirectionalIterator는 양방향 반복자라는 의미로 양방향 이동이 가능한 반복자를 말합니다.
양방향 반복자를 사용할 수 있는 컨테이너라면 무엇이든 reverse 함수를 사용할 수 있습니다.
string은 물론이고 vector, list도 가능하게 됩니다.