본문 바로가기

Programming/CPP11&14

[C++11] cbegin()과 cend(), crbegin()과 crend()

반응형

C++의 STL 컨테이너들은 Iterator(반복자)를 통해서 내부에 있는 데이터의 한 위치를 가리킬 수가 있습니다.

Iterator의 종류는 Input, Output, Foward, Bidirectional, Random Access로 구분할 수 있습니다.

Input과 Output은 각각 출력과 입력만을 담당하는 최소한의 기능을 가지고 있는 Iterator입니다.

Foward의 경우는 순방향 Iterator로 한 쪽으로(처음 -> 끝) 이동하는 Iterator입니다.

Bidirectional은 이름 그대로 양방향으로 이동이 가능한 Iterator입니다.

Random Access는 랜덤하게 한 곳을 콕 찝어서 이동이 가능한 Iterator입니다.

Input -> Foward -> Bidirectional -> Random Access는 각각 뒤의 Iterator가 앞의 Iterator의 기능을 포함합니다.

Iterator를 리턴하는 begin(), end(), rbegin(), rend() 메소드들이 존재합니다.

Iterator는 for 문을 돌리거나 STL이 제공하는 알고리즘을 실행할 때 사용하게 됩니다.

begin(), end()는 순방향으로 움직일 때 사용하며, rbegin(), rend()는 역방향으로 움직일 때 사용합니다.

iterator 타입은 선언할 때 타입 이름이 상당히 길게 열거됩니다.

std::vector< std::vector<int>>::iterator it = ptWord.begin();

그래서 C++11에서는 auto 라는 키워드가 추가가 되었습니다.

그런데 auto 키워드의 문제는 begin(), end(), rbegin(), rend() 로는 const_iterator 타입을 받을 수 없다는 것입니다.

begin()으로 받으면 타입 추론에 의해서 iterator 타입으로 받게 됩니다.

이런 이유로 cbegin()과 cend(), crbegin(), crend()가 새롭게 추가되었습니다.

상수 반복자라는 의미로 앞에 c가 붙었습니다.

이렇게 되면 반복자가 가리키는 곳의 값을 변경할 수 없습니다.

역방향 상수 반복자의 경우 const_reverse_iterator로 타입명만 해도 상당한 길이입니다.

auto와 crbegin()을 사용하면 간단하게 표현이 가능합니다.

auto it = ptWord.crbegin();

또한 순방향도 아래와 같이 간단하게 표현이 가능합니다.

auto it = ptWord.cbegin();

auto 키워드와 cbegin(), range based for loop 등을 사용하면 STL을 보다 편리하게 사용 가능해집니다.

반응형