const_iterator

·2024년 12월 18일
0

C++

목록 보기
24/26

iterator 보다 const_iterator를 선호하라

const_iterator

  • const를 가리키는 포인터의 STL 버전
  • 수정하면 안 되는 값을 가리킴
auto it = std::find(values.cbegin(), values.cend(), 1983);
values.insert(it, 1998);

추가학습

begin, end, rbegin 등의 비멤버 함수를 멤버 함수보다 선호하라

C++에서 beginend 같은 비멤버 함수 버전을 멤버 함수보다 선호하는 것은 주로 코드의 일관성, 유연성, 그리고 일반성을 높이기 위해 나온 관습임

  1. 일관성
    STL의 컨테이너들은 모두 std::beginstd::end같은 비멤버 함수를 지원함
    이러한 비멤버 함수는 컨테이너가 무엇이든 동일한 방식으로 사용될 수 있음
std::vector<int> vec = { 1, 2, 3 };
auto it = std::begin(vec); // 비멤버 함수 사용

auto it = vec.begin();     // 멤버 함수 사용

만약 멤버 함수만 사용한다면 특정 컨테이너나 클래스에 따라 begin(), cbegin(), rbegin()등을 명시적으로 호출해야 함
비멤버 함수를 사용하면 이러한 호출 방식의 차이를 줄이고, STL 스타일의 함수 호출 패턴을 유지할 수 있음

  1. 유연성
    비멤버 함수인 std::beginstd::end는 사용자 정의 타입에도 적용될 수 있도록 설계됨
    이를 통해 커스터마이징된 타입에도 동일한 방식으로 사용할 수 있음
    예를 들어, 사용자 정의 컨테이너 타입이 std::beginstd::end를 오버로드하면 STL과 동일하게 동작할 수 있음
struct CustomContainer
{
	int data[3] = { 1, 2, 3 };
    int* begin() { return &data[0]; }
    int* end() { return &data[3]; }
};

CustomContainer c;
for (auto it = std::begin(c); it != std::end(c); ++it)
{
	std::cout << *it << " "; // 1 2 3
}

여기서 std::beginstd::end을 사용하면 내부적으로 적절한 멤버함수를 호출해주므로 STL과 사용자 정의 컨테이너 간의 일관성을 유지할 수 있음

  1. 범용성
    비멤버 함수는 포인터와 같은 원시 배열에서도 사용할 수 있음
int arr[] = { 1, 2, 3 };
auto it = std::begin(arr);   // arr의 시작 주소 반환
auto end_it = std::end(arr); // arr의 끝 주소 반환

반면 멤버 함수는 이런 원시 타입에서 사용할 수 없음

정리

  • iterator 보다 const_iterator를 선호하라
  • 최대한 일반적인 코드에서는 begin, end, rbegin 등의 비멤버 버전들을 해당 멤버 함수들보다 선호해라

0개의 댓글

관련 채용 정보