>백엔드 개발 >C++ >C에서 범위 기반 For 루프를 사용하여 사용자 정의 유형을 반복 가능하게 만들려면 어떻게 해야 합니까?

C에서 범위 기반 For 루프를 사용하여 사용자 정의 유형을 반복 가능하게 만들려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-28 22:06:15576검색

How Can I Make My Custom Types Iterable Using Range-Based For Loops in C  ?

사용자 정의 유형과 함께 "범위 기반 for 루프" 사용

사용자 정의 유형 통합

사용자 정의 유형에서 "범위 기반 for 루프"를 활성화하려면 다음을 구현할 수 있습니다. 다음:

  • 멤버 함수: 반복자처럼 작동하는 객체를 반환하는 begin()end() 멤버 함수를 정의합니다.
  • 무료 기능: 무료 기능 만들기 begin(Type&)end(Type&)은 사용자 정의 유형과 동일한 네임스페이스를 사용하여 반복자처럼 동작하는 객체를 반환합니다.

네임스페이스 고려사항

  • 사용자 정의 유형이 xml 네임스페이스에서 xml::begin() 또는 xml::end()를 정의하여 올바른 네임스페이스 연결을 보장하세요.

반환 값 요구 사항

반환된 객체 begin()end()는 실제 반복자일 필요는 없습니다. 다음 요구 사항을 충족해야 합니다.

  • 사전 을 구현하여 유효한 초기화 표현식을 보장합니다.
  • 부울 비교를 위해 바이너리 !=를 구현합니다. .
  • 단항 *을 구현하여 다음을 제공합니다. 루프 변수에 할당하기 위한 값.
  • 공개 소멸자를 노출합니다.

분리된 유형

C 17에서 유형은 시작이 완료되었습니다. 분리됨. 이를 통해 끝 반복자가 시작 반복자와 다른 유형을 가질 수 있습니다. 이는 시작 반복자 유형으로 !=만 지원하는 "센티넬" 반복자에 유용하며, null로 끝나는 char 버퍼에 대한 효율적인 반복을 가능하게 합니다.

라이브러리 확장 예

도서관 유형을 고려해보세요 some_struct_you_do_not_control은 정수 벡터를 포함하지만 begin()end() 메서드는 없습니다.

namespace library_ns {
  struct some_struct_you_do_not_control {
    std::vector<int> data;
  };
}

만들려면 이 유형은 반복 가능하므로 다음 기능을 추가할 수 있습니다. library_ns 네임스페이스:

namespace library_ns {
  int* begin(some_struct_you_do_not_control&amp; x){ return x.data.data(); }
  int* end(some_struct_you_do_not_control&amp; x){ return x.data.data()+x.data.size(); }
  int const* cbegin(some_struct_you_do_not_control const&amp; x){ return x.data.data(); }
  int* cend(some_struct_you_do_not_control const&amp; x){ return x.data.data()+x.data.size(); }
  int const* begin(some_struct_you_do_not_control const&amp; x){ return cbegin(x); }
  int const* end(some_struct_you_do_not_control const&amp; x){ return cend(x); }
}

이제 범위 기반 for 루프를 사용하여 벡터를 반복할 수 있습니다.

library_ns::some_struct_you_do_not_control s;
for (int i : s) {
  // ...
}

사용자 정의 유형 예

귀하가 제어하는 ​​사용자 정의 유형의 경우 유형 내에서 직접 begin()end() 메소드:

struct egg_carton {
  std::vector<egg> eggs;
  auto begin() { return eggs.begin(); }
  auto end() { return eggs.end(); }
  // ...
};

위 내용은 C에서 범위 기반 For 루프를 사용하여 사용자 정의 유형을 반복 가능하게 만들려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.