C++/레퍼런스(Reference)

C++ STL: std::rbegin, std::rend, std::crbegin, std::crend

kim선달 2020. 11. 1. 18:16
Select Language

 

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 초과 범위 이외의 값을 읽거나 쓰는건 정의되지 않은 행동 입니다.

 

사진 출처: https://en.cppreference.com/

 

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 

 


같이 알면 좋은 것들