>  기사  >  백엔드 개발  >  C 정의 동작에서 다른 컨테이너의 반복자를 비교하고 있습니까?

C 정의 동작에서 다른 컨테이너의 반복자를 비교하고 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-03 06:03:30696검색

Is Comparing Iterators from Different Containers in C   Defined Behavior?

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

사용자 정의 반복자 구현의 맥락에서 근본적인 질문이 생깁니다. 반복자를 비교하는 것이 허용됩니까? 별도의 컨테이너에서? 예를 들어 다음 코드 조각을 살펴보겠습니다.

<code class="cpp">std::vector<int> foo;
std::vector<int> bar;

// Is this expression valid?
foo.begin() == bar.begin();</code>

C 11 표준에 따르면:

동일 시퀀스 내의 반복자:

  • 증가 연산자( )를 반복적으로 적용하여 동일하게 되면 반복자는 서로 도달 가능한 것으로 간주됩니다.
  • 반복자는 서로 도달할 수 있는 경우 동일한 시퀀스의 요소를 참조합니다.

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

  • 순방향 반복자의 경우 반복자 비교는 동일한 기본 시퀀스에 속하는 경우에만 정의됩니다.

따라서 위의 예에서 foo.begin() 및 bar.begin()과 같은 다른 컨테이너의 반복자를 비교하는 것은 정의되지 않은 동작으로 간주됩니다.

이 정의되지 않은 동작 이는 반복자가 컨테이너 내의 특정 요소를 참조한다는 사실에서 비롯됩니다. 반복자가 다른 컨테이너에 속하는 경우 동일한 기본 시퀀스의 요소를 가리킨다고 가정할 수 없으므로 비교 시 정의되지 않은 결과가 생성됩니다.

LWG Issue #446:

이 문제를 명확히 하기 위해 LWG 문제 #446에서는 다음 텍스트를 표준에 추가할 것을 제안했습니다.

다음에서 얻은 비교 함수 또는 두 개의 반복자 값을 인수로 사용하는 이항 연산자를 직접 또는 간접적으로 평가한 결과 두 개의 서로 다른 범위는... 달리 명시적으로 설명되지 않는 한 정의되지 않습니다.

이 추가는 개별 컨테이너의 반복자를 비교하는 정의되지 않은 특성을 더욱 강조합니다.

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

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