2016-11-06 2 views
3

나는 이것을보기에 알맞은 소스를 찾을 수 없었습니다. <algorithm> 헤더의 모든 알고리즘이 std::advance을 사용하여 이터레이터를 증가시키고 감소시킬 수 있습니까?C++ 표준 라이브러리 알고리즘은 std :: advance를 사용합니까?

또 다른 관련 후속 조치 - RandomAccessIterator 개념 (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)에 대한 cppreference 페이지를 보았지만 iterator 카테고리에 대한 멤버 별칭을 요구하지 않았습니다. 반복기 클래스에 이라는 별칭을 가진 멤버 typedef가없고 random_access_iterator_tag이라는 별칭이 지정되었지만 RandomAccessIterator에 대한 cppreference 페이지 (http://en.cppreference.com/w/cpp/concept/RandomAccessIterator)에 언급 된 작업을 지원하는 경우 C++ 표준 라이브러리는 반복기가 임의 액세스 반복기라고 가정합니까?

참고 나는이 질문을 C++ 표준과 관련하여 질문하고자했습니다. 즉 "표준이 이것에 관해 무엇이라고 말합니까?"

+0

반복자를 1 개 이상 앞당길 필요가있는 어떤 알고리즘도 생각할 수 없다. 보통 떠오르는 알고리즘은 반복자를 증가 시키거나 감소시킬 것이므로,'++' 및'--'. 아마 종류와 셔플을 제외하고. 그러나 어떤 경우이든 헤더 파일 자체를 검색하여 쉽게 대답을 결정할 수 있습니다. 너 혼자 이것을 알아낼 수 있어야한다. –

+2

@SamVarshavchik 나는이 질문에 표준에서 가능한 인용문을 찾았다. 표준을 유지하면서 변경 될 수 있기 때문에 구현을 보는 것만으로는 충분하지 않습니다. 또한 자주 사용되는'std :: upper_bound'와'std :: lower_bound'는 대부분의 구현에서'n' 단계로 반복자를 진행시키기 위해'std :: advance'를 사용합니다. – Curious

+0

전체 섹션 25, 도서관". 맨 처음에'advance()'에 대한 언급이 하나 있는데,이 절의 스펙에서'a + n '에 대한 참조는 비 랜덤 액세스 반복자에 적용 할 때 "as ''advance()'가 사용 되었다면. 나는 이것이 실제로'advance()'를 요구한다고 주장 할 준비가되어 있지 않다. 그것은 advance()가 사용 된 것처럼 "단지"상태를 나타냅니다. 분명히 * advance()를 금지하지는 않지만 IMO는 요구하지 않습니다. 여기에'language-lawyer' 태그를 추가 할 것입니다. –

답변

2

표준은 C++ std 알고리즘의 구현을 명시 적으로 지정하지 않습니다. 행동을 지정하고 때로는 특정 작업이 몇 번 수행되는지 지정합니다. 이것은 실용적인 선택의 여지없이 구현자를 떠날 수 있지만 명시 적으로 지정되지는 않습니다.

std::advance은 내가 아는 한 다른 알고리즘에 의해 호출 된 것으로 표준에서 결코 호출되지 않습니다. 이는 특정 알고리즘의 특정 구현에서 사용되거나 사용되지 않을 수 있음을 의미합니다.

std::advance의 효과가 지정됩니다. 다른 알고리즘이 작동 횟수를 지정하는 한 std::advance으로 전화를 걸려면 보장을 깨서는 안됩니다.

요컨대, 그것을 사용하는 것은 허용되며 필수는 아닙니다.

관련 문제