IT Share you

std :: advance와 std :: next의 차이점은 무엇입니까?

shareyou 2020. 12. 15. 20:24
반응형

std :: advance와 std :: next의 차이점은 무엇입니까?


음수를 넘어서는 더 많은 것이 있습니까?


std::advance

  • 인수를 수정
  • 아무것도 반환하지 않는다
  • 입력 반복자 이상에서 작동합니다 (또는 음의 거리가 주어지면 양방향 반복기).

std::next

  • 인수를 수정하지 않고 그대로 둡니다.
  • 지정된 양만큼 앞선 인수의 복사본을 반환합니다.
  • 순방향 반복자 이상에서 작동합니다 (또는 음의 거리가 제공되는 경우 양방향 반복기))

아마도 가장 큰 실질적인 차이점은 std::next()C ++ 11에서만 사용할 수 있다는 것 입니다.

std::next()기본적으로 하나씩 진행되지만 std::advance()거리가 필요합니다.

그리고 반환 값이 있습니다.

std::next()처럼 음수를 취하며이 std::advance경우 반복기가 양방향이어야합니다. std::prev()의도가 특히 뒤로 이동하려는 경우 더 읽기 쉽습니다.


std :: advance

advance () 함수는 인수로 전달 된 반복기의 위치를 ​​증가시킵니다. 따라서이 함수를 사용하면 반복기가 둘 이상의 요소를 앞으로 (또는 뒤로) 이동할 수 있습니다.

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • 입력 반복기 pos가 n 요소를 앞으로 ( 또는 뒤로 ) 이동할 수 있도록 합니다.
  • 양방향 및 임의 액세스 반복기의 경우 n이 음수이면 뒤로 이동할 수 있습니다.
  • Dist는 템플릿 유형입니다. 일반적으로 <, ++,-및 0과의 비교와 같은 연산이 호출되므로 정수 유형이어야합니다.
  • advance ()는 시퀀스의 end ()를 교차하는지 여부를 확인하지 않습니다 (일반적으로 반복기가 작동하는 컨테이너를 모르기 때문에 확인할 수 없습니다). 따라서이 함수를 호출하면 시퀀스의 끝에 대해 ​​++ 연산자를 호출하는 것이 정의되지 않았기 때문에 정의되지 않은 동작이 발생할 수 있습니다.

std :: next (및 std::prevC ++ 11의 새로운 기능)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • 앞으로 1 또는 n 위치로 이동하면 앞으로 반복기 pos가 가질 위치를 나타냅니다.
  • 양방향 및 랜덤 액세스 반복기의 경우 n은 이전 버전을 생성하기 위해 음수 일 수 있습니다.
  • Dist는 std :: iterator_traits :: difference_type 유형입니다.
  • 내부 임시 개체에 대해 advance (pos, n)을 호출합니다.
  • next ()는 시퀀스의 end ()를 통과하는지 여부를 확인하지 않습니다. 따라서 결과가 유효한지 확인하는 것은 호출자에게 달려 있습니다.

인용하다 The C++ Standard Library Second Edition


std::next복사본 반환 std::advance하고 인수를 수정 한다는 점을 제외하면 거의 동일 합니다. 표준은 다음 std::next과 같이 작동 해야 합니다 std::advance.

24.4.4 반복자 연산 [iterator.operations]

template <class InputIterator, class Distance>
void advance(InputIterator& i [remark: reference], Distance n);

2. 요구 사항 : n은 양방향 및 랜덤 액세스 반복자에 대해서만 음수 여야합니다.
3. 효과 : 반복기 참조 i를 n만큼 증가시킵니다 (또는 음수 n에 대해 감소).
[...]

template <class ForwardIterator>
ForwardIterator next(ForwardIterator x, [remark: copy]
     typename std::iterator_traits<ForwardIterator>::difference_type n = 1);

6. 효과 : 동등 advance(x, n); return x;

참고 모두 반복기는 입력 반복자 경우 실제로 음의 값을 지원한다. 또한 std::next반복기가 ForwardIterator의 조건을 충족 std::advance해야하지만 입력 반복자 만 필요합니다 (음의 거리를 사용하지 않는 경우).

ReferenceURL : https://stackoverflow.com/questions/15017065/whats-the-difference-between-stdadvance-and-stdnext

반응형