Effective C++에서 다루었던 내용이 반복자에서도 마찬가지로 적용된다.
반복자가 가리키는 것을 수정할 필요가 없다면 const_iterator를 사용해주면 된다.
C++98때와는 다르게 이제는 컨테이너에서 cbegin, cend로 const_iterator를 매우 쉽게 얻어낼 수 있다.
const_iterator를 사용하지 못하는 경우는 한 가지, 최대한 일반적인 라이브러리를 작성할 때이다.
begin, end함수를 비멤버 함수로 제공해야 할 때, C++11에서는 begin, end 딱 두가지만 추가되었기때문에 비멤버 const_iterator를 작성하더라도 C++11 환경에서는 동작하지 않는다.
물론 이런 경우라면 const 참조 매개변수를 통해 비멤버 begin, end를 호출하면 된다.
template<class C>
auto cbegin(const C& container)->decltype(std::begin(container)) {
return std::begin(container); // 멤버 함수 begin 또는 cbegin 호출
}
C++11같이 비멤버 const_iterator가 지원되지 않는다면 그냥 begin을 반환할 것이고 지원된다면 cbegin을 반환할 것이다.
이 템플릿은 내장 배열 타입일때도 사용이 가능해진다. 반복자 begin 대신 배열의 첫 원소를 가리키는 포인터가 반환된다.
설명이 조금 길어졌지만 요점은 반복자 역시 가능하면 const_iterator를 사용하라는 것이다.
◾ iterator보다 const_iterator를 선호하라.
◾ 최대한 일반적인 코드에서는 begin, end, rbegin 등의 비멤버 버전들을 해당 멤버 함수들보다 선호하라.
'도서 > Effective Modern C++' 카테고리의 다른 글
[3장] 항목 15 : 가능하면 항상 constexpr을 사용하라 (0) | 2023.01.17 |
---|---|
[3장] 항목 14 : 예외를 방출하지 않을 함수는 noexcept로 선언하라 (0) | 2023.01.17 |
[3장] 항목 12 : 재정의 함수들을 override로 선언하라 (0) | 2023.01.17 |
[3장] 항목 11 : 정의되지 않은 비공개 함수보다 삭제된 함수를 선호하라 (0) | 2022.12.29 |
[3장] 항목 10 : 범위 없는 enum보다 범위 있는 enum을 선호하라 (0) | 2022.12.29 |