2009-11-03 3 views

답변

16

추가는 임의 액세스 반복기에서만 작동합니다. std :: advance는 모든 종류의 반복자에서 작동합니다. 반복자 만 벡터로 처리하는 한 실제로 차이는 없지만 std :: advance는 코드를보다 일반적으로 유지합니다 (예 : 벡터 목록을 대체 할 수 있고 그 부분은 여전히 ​​작동 할 수 있음). 사업자, 라이브러리가이 개 기능을 제공합니다 - 단지 임의 접근 반복자는 +와를 제공하기 때문에

:

편집 : (§24.3.4/1)을 다음과 같이 관심있는 사람들을 위해, 표준은 advancedistance 설명 템플릿 advancedistance. 이러한 함수 템플릿은 무작위 액세스 반복자에 대해 +-을 사용합니다 (따라서 일정 시간이기 때문에). 입력, 순방향 및 양방향 반복자의 경우 선형 시간 구현을 제공하기 위해 ++을 사용합니다.

+12

반면에 덜 일반적인 코드를 사용하면 의도하지 않은 코드 축소를 막을 수 있습니다. 결국 목록 컨테이너로 "임의 액세스"를 많이하는 것이 좋지 않을 수 있습니다. – UncleBens

0

반복기에 따라 다릅니다. it=it+5은 지원되는 경우 빠릅니다 (임의 액세스 반복기에서만 지원됩니다). 성능이 낮은 반복기 (예 : 전달 반복자 또는 양방향 반복자)를 전진하려면 std::advance을 사용할 수 있지만 실제로 모든 중간 요소를 통과하기 때문에 속도가 느립니다.

+1

std :: advance는 임의 액세스 순서에 대해 선형이라는 지시가 잘못되었습니다. "복잡도 : InputIterator가 임의 액세스 반복기의 모델 인 경우 일정 시간, 그렇지 않으면 선형 시간입니다." – Blindy

+1

std :: advance는 임의 액세스 반복기 (§24.3.4/1)의 일정 시간입니다. –

+0

랜덤 액세스 반복자에 대해서는 이것이 사실이라고 생각하지 않습니다. std :: advance는이 경우 + 연산자만큼 효율적이어야합니다. – Kylotan

0

std::advance은 랜덤 액세스 시퀀스 (벡터 등)에 대해 += 버전이 작동하는 동안 무작위 반복기에서도 작동합니다.

0

std::adnvance은 일반적입니다. 기본 컨테이너의 유형을 항상 알 필요가없는 경우 유용합니다. 모든 경우에 사용할 수 있습니다.

그러나 그것은 효율적입니다 : std::advance 그것 (std::vector에서처럼)를 RandomAccessIterator을 통과하면 최적화를 수행하고 ForwardAccessIterator에 대한 루프에서 반복자를 증가 할 것이다 (같은 std::list에서 같은).

0

std :: advance를 사용하십시오. 그것은 효율적이며 (반복자 특성을 사용하여 임의 액세스 반복자를 반복자로 추가 함) 다른 유형의 반복자에서도 작동한다는 점에서 더 일반적입니다. 당신이 필요에 따라

7

는 : 가들이 generic, std::advance(it,2)를 사용

당신이 필요합니다. 누군가가 따라오고 std::vectorstd::list으로 변경하면 코드가 계속 컴파일되지만 일정 시간이 아닌 선형 시간이 걸립니다.

당신이 성능 필요한 경우, it+=2를 사용합니다. 누군가 std::vectorstd::list으로 변경하면 심각한 성능 문제가 발생하여 코드를 컴파일하지 못해 도움이되는 의견을 나타낼 수 있습니다.

0

컨테이너를 변경하지 않으려 고하고 (아마도 그렇지 않은 경우)보기 쉽고 이해하기 쉬우 며 코드를 덜 어둡게 남겨두기 때문에 +를 사용하십시오.

컨테이너를 변경하려는 경우 또는 다양한 컨테이너 유형에서 인스턴스화 할 수있는 템플릿 내부에서 작업하는 경우 아무 것도 작동하지 않으므로 advance를 사용하십시오.

일반적으로 컨테이너 유형을 변경해야 할 때 컨테이너가 사용되는 모든 곳을 다시 방문하게되는 것을 발견했기 때문에 컨테이너 유형을 변경하는 것에 대해 걱정하지 않아도됩니다. 갑자기 어리석은 일을하지 않습니다. (목록의 중간에서 임의로 요소를 뽑아내는 것과 같이).

관련 문제