2013-06-04 13 views
6

현재 STL을 배우고 있으며 find 및 const 반복자에 대한 불확실성이 있습니다. 의 내가이 찾기 기능을 가지고 있다고 가정 해 봅시다 : 그 후C++ STL, 상수 반복자, find()

some_stl_container::const_iterator found = myContainer.find(value); 

은 내가 다른 const_iterator를 상대로 found을 위해 가지고, 또는 단순히 반복자에 대해 확인을 할 유효한 무엇인지 확인해야합니다.

if(found!=myContainer.cend()) 

이 : 은 기본적으로 어떤이 일을 사이에 차이가있을 것이다 (적어도 나에게)

if(found!=myContainer.end()) 

첫 번째 외모보다 정확한을하지만, 두 번째는 바로, 너무 잘 작동합니다?

+0

가능한 복제본 [const가 아닌 반복기 비교, 유효한 있습니까?] (http://stackoverflow.com/questions/16900498/const-to-non-const-iterator-comparisons-are-they- valid) – juanchopanza

+0

Cend가 C++ 11까지 존재하지 않는다는 것을 고려할 때, * 할 일이 * 있어야했다. –

답변

8

모든 표준 라이브러리 컨테이너는 Container::iteratorContainer::const_iterator으로 변환 될 수 있다는 요구 사항을 충족합니다. 따라서 두 비교 모두 유효하며 동일한 결과를 산출합니다.

§23.2.1 에서 - 도표 96

X::iterator... 전방 반복자에게 요구 사항을 충족하는 반복자 범주입니다. 컨버터블은 X::const_iterator입니다.

+0

재미있는 점은 표준에서'x.cend() == X :: const_iterator (x.end()) '라는 확인을 찾았습니다. 그리고 하나를 찾지 못했습니다 (일부 명백한 논리적 결론이 누락되었을 수 있습니다). 정의에 의해'x.cend() == const_cast (x) .end()'하지만 이것이 어떻게 첫 번째 주장을 증명하는지는 모르겠다. –

+0

@SergeDundich 귀하의 질문을 이해할 수 있는지 잘 모르겠습니다. 필자가 인용 한 것은 콘테이너에 관해서,'iterator'가'const_iterator'로 변환 가능하다는 것을 분명히 말합니다. 만약 우리가'operator =='를 사용하여 2 개의 반복자를 비교할 수있게 해달라고 요청한다면, 나의 [this answer] (http://stackoverflow.com/a/16901637/241631)을 참조하십시오. – Praetorian

1

이터레이터가 myContainer.end()과 다른지 확인하십시오. cendcbegin 메서드는 const 반복자를 명시 적으로 얻기 위해 여기에만 있으므로 사용자의 경우에는 아무런 차이가 없습니다. 당신이 11 C++로 auto found = myContainer.find(value)을 할 수

참고 반복자 유형을 추론하고, 어떤 사람들은 표준 라이브러리 올바른 이름 (STL)이라고 주장 것이다.

+1

두 번째 발언 : http://en.wikipedia.org/wiki/Standard_Template_Library – lightxbulb

+0

사실 원래 STL과 다른 http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library를 의미합니다 (http://stackoverflow.com/questions/5205491/whats-this-stl-vs-c-standard-library-fight-all-about)하지만 그것은 수염이 많은 순수한 주장입니다. p –

+0

@lightxbulb : 내가 링크 한 기사 설명하기 위해 STL은 현대 표준 라이브러리의 일부분에 영감을 준 고대 도서관입니다. 당신의 질문은 STL이 아니라 C++ 11 표준 라이브러리에 관한 것입니다 (STL 컨테이너에는'cend' 함수가 없었기 때문에). –