💡 Intro
코딩테스트를 C++로 준비하면서 익숙하지 않은 STL들의 사용법을 정리하려고 한다. 이번에는 string 문자열을 거꾸로 돌려주는 std::resverse 함수에 대해 알아보려고 한다.
💡 std::reverse
std::reverse 함수 선언
template <class _BidIt>
void reverse(const _BidIt _First, const _BidIt _Last)
- reverse elements in [_First, _Last) 와 같은 주석도 함께 달려있는데 first부터 last바로 전 인덱스까지의 요소들을 거꾸로 뒤집는 역할을 한다고 볼 수 있다.
std::reverse 함수 정의 에서 중요한 부분을 떼오면 다음과 같다.
void reverse(const _BidIt _First, const _BidIt _Last) {
for (; _UFirst != _ULast && _UFirst != --_ULast; ++_UFirst) {
_STD iter_swap(_UFirst, _ULast);
}
}
- iter_swap은 swap함수를 한겹 더 쌓아서 iterator를 스왑할 수 있도록 만든 함수다.
- for문을 살펴보면 first와 last가 같지 않고, first와 --last가 같지 않은 상태일 때 iter_swap함수를 이용하여 두 값을 스왑한다. 그리고 first값을 증가시킨다.
- CRONG를 예로 들어 따라가보자.
- first : C를 가리킨다.
- last : G의 다음 위치를 가리킨다.(str.end()는 맨 마지막 요소의 다음 요소를 가리킨다.)
- _UFirst != _ULast && _UFirst != --_ULast 를 통해 for문 안으로 들어가면서 last는 --가 되어 G를 가리키게 된다.
- iter_swap(C, G)을 통해 C와 G는 스왑된다.
- ++_UFirst 이기 때문에 first가 ++되어 first는 R을 가리키게 된다.
- _UFirst != _ULast && _UFirst != --_ULast 를 통해 last는 N을 가리키게 된다.
- 위 로직대로 first와 last가 만나는 시점전까지 first와 last를 바꾼다.
사용
#include<iostream>
#include<algorithm> //reverse
#include<string> //string
using namespace std;
int main(void)
{
string str = "CRONG";
cout << "Before : " << str << endl; //"CRONG"
reverse(str.begin(), str.end());
cout << "After : " << str << endl; //"GNORC"
return 0;
}
결과
reverse 함수는 string뿐 아니라 iterator를 사용할 수 있는 컨테이너에 모두 적용할 수 있다. 간단하게 벡터에 대한 예를 보자.
#include<iostream>
#include<algorithm> //reverse
#include<vector>
using namespace std;
void printVector(const vector<int>& v)
{
for (auto val : v)
{
cout << val << ", ";
}
cout << endl;
}
int main(void)
{
vector<int> v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
cout << "Before : ";
printVector(v);
reverse(v.begin(), v.end());
cout << "After : ";
printVector(v);
return 0;
}
결과
참고