>백엔드 개발 >C++ >C에서 다른 컨테이너의 반복자를 비교하는 것이 유효합니까?

C에서 다른 컨테이너의 반복자를 비교하는 것이 유효합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-02 09:02:291064검색

Is It Valid to Compare Iterators from Different Containers in C  ?

고유 컨테이너의 반복자 비교

컨테이너로 작업할 때는 서로 다른 컨테이너의 반복자를 비교하는 것의 의미를 이해하는 것이 중요합니다. 질문이 생깁니다: 개별 컨테이너에 속한 반복자를 비교하는 것이 허용됩니까?

다음 코드를 고려하십시오.

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;
std::cout << (foo.begin() == bar.begin());</code>

foo.begin() == bar.begin() 표현식이 될까요? false를 생성하거나 정의되지 않은 동작으로 이어질까요?

C 11 표준(n3337)을 자세히 살펴보면 이 딜레마를 밝힐 수 있습니다.

동일 시퀀스 내의 반복자

  • 섹션 24.2.1에서는 i를 j와 동일하게 만드는 i 연산의 유한 시퀀스가 ​​있는 경우 두 개의 반복자 i와 j가 도달 가능한 것으로 간주된다고 명시합니다.
  • i에서 j에 도달할 수 있는 경우 , 동일한 시퀀스의 요소를 참조합니다.

다른 컨테이너의 반복자 비교

  • RandomAccessIterator를 포함하는 ForwardIterator에는 섹션 24.2가 적용됩니다. 5.
  • 이 섹션에서는 ==가 동일한 기본 시퀀스에 대해 반복자를 비교하는 데만 사용될 수 있음을 지정합니다.

이러한 요구 사항을 고려할 때 다른 컨테이너의 반복자를 비교하는 것은 정의되지 않은 동작입니다.

LWG Issue #446

LWG Issue #446은 이 질문을 명시적으로 다루며 표준에 다음 추가 사항을 제안합니다.

"직접 또는 하나의 공통 범위의 하위 범위가 아닌 두 개의 서로 다른 범위 r1 및 r2 [...]에서 얻은 인수로 두 개의 반복자 값을 사용하는 비교 함수 또는 이진 - 연산자를 간접적으로 평가하는 것은 달리 명시적으로 설명되지 않는 한 정의되지 않습니다."

결론적으로, 개별 컨테이너의 반복자를 비교하는 것은 정의되지 않은 동작이며, 사용자 정의 반복자를 작성하고 코드에서 컨테이너를 조작할 때 이 제약 조건을 준수하는 것이 중요합니다.

위 내용은 C에서 다른 컨테이너의 반복자를 비교하는 것이 유효합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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