역방향 반복자
<algorithm>의 std::find 나 std::find_if를 뒤에서 부터 탐색해야 되는 경우가 있다.
이 경우 역방향 반복자인 rbegin()을 rend() 까지 순회하면 된다.
auto it = std::find(arr.begin(), arr.end(), 2); // 정방향 순회하면서 2를 찾음
auto r_it = std::find(arr.rbegin(), arr.rend(), 2); // 역방향 순회하면서 2를 찾음
역방향으로 반복하다가 원하는 값을 찾으면 다시 정방향으로 변환해야 되는 경우
base() 함수를 이용하면 된다.
그러나 역방향 반복자는 원하는 위치에서 한칸 앞으로 이동한 반복자이므로,
정방향을 구하는 base()를 사용한 경우, reverse_iterator::base()는 해당 reverse_iterator가 가리키는 원래의 위치에서 한 칸 뒤로 이동한 위치를 가리킨다.
auto base_iter = rit.base();
쉽게 생각하면 base()를 호출하면
현재 역방향 벡터가 가리키고있던 위치에서 정방향으로 한칸 이동한 위치가 반환된다고 생각하자.
사용 예시
1) 주어진 벡터에서 2를 포함하는 가장 작은 부분 벡터 구하기
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> arr) {
auto it = std::find(arr.begin(), arr.end(), 2);
if (it == arr.end())
{
return vector<int>{ -1 };
}
auto r_it = std::find(arr.rbegin(), arr.rend(), 2);
auto r_baseit = r_it.base();
return vector<int>(it, r_baseit);
}
2) .base() 가 출력하는 값 테스트
#include <iostream>
#include <vector>
#include <iterator> // std::reverse_iterator
int main() {
std::vector<int> vec = {10, 20, 30, 40, 50};
// reverse_iterator로 뒤에서부터 순회
auto rit = vec.rbegin(); // 뒤에서부터 시작
std::cout << "reverse_iterator points to: " << *rit << std::endl; // 50
// base()를 사용하여 원래 반복자 얻기
auto base_iter = rit.base(); // reverse_iterator에서 base() 호출
// base()가 가리키는 원래 위치는 rbegin()의 한 칸 뒤
std::cout << "base() iterator points to: " << *(base_iter - 1) << std::endl; // 50
return 0;
}
'🌍 C++ Study > C++ 기초' 카테고리의 다른 글
C++ vector 두 벡터 합치기, 이어 붙이기 (0) | 2024.11.20 |
---|---|
C++ std::distance 이터레이터의 거리 구하기 (0) | 2024.11.20 |
C++ vector의 부분 벡터 구하기 (0) | 2024.11.20 |
C++ std::count string의 문자 갯수 세기 std::count_if (0) | 2024.11.19 |
C++ vector sort 벡터 정렬 algorithm (0) | 2024.11.17 |