std::rbegin, std::rend
std::crbegin, std::crend
요약
기본 배열 타입은 자동으로 알맞은 reverse_iterator를 만들어 되돌려 줍니다.
그 외에는 인자로 받은 객체의 동일한 이름의 메서드를 호출합니다.
즉, 알맞은 메서드가 정의되어 있다면 사용자 정의 클래스도 인자로 넘겨 줄 수 있습니다.
설명
std::rbegin 은 마지막 원소 주소를, std::rend 는 처음 원소의1칸 이전 주소를 가리키는 reverse_iterator를 만들어 반환합니다.
std::crbegin, std::crend 는 각각 std::rbegin, std::rend 와 동일한 곳을 가리키는 const reverse_iterator를 반환합니다.
std::end 가 실제 마지막 원소보다 1칸 더 다음 주소를 가리켰다면, std::crend 은 처음 원소보다 1칸 이전 주소를 가리킵니다.
마찬가지로, std::rbegin 이하 std::rend 초과 범위 이외의 값을 읽거나 쓰는건 정의되지 않은 행동 입니다.
for(auto it = std::rbegin(v); it < std::rend(v); ++it)
// 알맞은 코드!
for(auto it = std::rbegin(v); it > std::rend(v); --it)
// 루프가 돌지 않음!
reverse_iterator 는 비교 연산자 및 증감 연산자가 오버로딩 되어 있으므로, 실제 주소의 위치를 생각하시고 범위 유효성을 체크하시면 의도하지 않은 동작을 할 수 있습니다.
그냥 std::begin, std::end 을 사용하실때와 범위 유효성 검사나 증감을 동일하게 하시면 됩니다.
예시 코드:
#include <iostream>
#include <iterator>
int main()
{
int a[] = { -5, 10, 15 };
std::cout << *std::rbegin(a) << std::endl;
for(auto it = std::rbegin(a); it!=std::rend(a); ++i)
std::cout << *it << " ";
}
출력:
15
15 10 -5
같이 알면 좋은 것들
- std::begin, std::end, std::cbegin, std::cend
- reverse_iterator
- 함수 오버로딩(overloading)
'C++ > 레퍼런스(Reference)' 카테고리의 다른 글
C++ Reference: std::integer_sequence, std::index_sequence (0) | 2020.10.29 |
---|---|
C++ 레퍼런스: std::begin, std::end, std::cbegin, std::cend (2) | 2020.10.29 |