내가 자신이 다음과 같은 많은 기록 발견 :std :: vector에 대한 고급 반복기 std :: advance VS 연산자 +?
int location =2;
vector<int> vec;
vector<int>::iterator it=vec.begin();
/..../
std::advance(it, location);
대신
it= it + 5;
의를 기본 설정/권장 방법은 무엇입니까?
내가 자신이 다음과 같은 많은 기록 발견 :std :: vector에 대한 고급 반복기 std :: advance VS 연산자 +?
int location =2;
vector<int> vec;
vector<int>::iterator it=vec.begin();
/..../
std::advance(it, location);
대신
it= it + 5;
의를 기본 설정/권장 방법은 무엇입니까?
추가는 임의 액세스 반복기에서만 작동합니다. std :: advance는 모든 종류의 반복자에서 작동합니다. 반복자 만 벡터로 처리하는 한 실제로 차이는 없지만 std :: advance는 코드를보다 일반적으로 유지합니다 (예 : 벡터 목록을 대체 할 수 있고 그 부분은 여전히 작동 할 수 있음). 사업자, 라이브러리가이 개 기능을 제공합니다 - 단지 임의 접근 반복자는 +와를 제공하기 때문에
:
편집 : (§24.3.4/1)을 다음과 같이 관심있는 사람들을 위해, 표준은
advance
및distance
설명 템플릿advance
및distance
. 이러한 함수 템플릿은 무작위 액세스 반복자에 대해+
및-
을 사용합니다 (따라서 일정 시간이기 때문에). 입력, 순방향 및 양방향 반복자의 경우 선형 시간 구현을 제공하기 위해++
을 사용합니다.
반복기에 따라 다릅니다. it=it+5
은 지원되는 경우 빠릅니다 (임의 액세스 반복기에서만 지원됩니다). 성능이 낮은 반복기 (예 : 전달 반복자 또는 양방향 반복자)를 전진하려면 std::advance
을 사용할 수 있지만 실제로 모든 중간 요소를 통과하기 때문에 속도가 느립니다.
std::advance
은 랜덤 액세스 시퀀스 (벡터 등)에 대해 +=
버전이 작동하는 동안 무작위 반복기에서도 작동합니다.
std::adnvance
은 일반적입니다. 기본 컨테이너의 유형을 항상 알 필요가없는 경우 유용합니다. 모든 경우에 사용할 수 있습니다.
그러나 그것은 효율적입니다 : std::advance
그것 (std::vector
에서처럼)를 RandomAccessIterator을 통과하면 최적화를 수행하고 ForwardAccessIterator에 대한 루프에서 반복자를 증가 할 것이다 (같은 std::list
에서 같은).
std :: advance를 사용하십시오. 그것은 효율적이며 (반복자 특성을 사용하여 임의 액세스 반복자를 반복자로 추가 함) 다른 유형의 반복자에서도 작동한다는 점에서 더 일반적입니다. 당신이 필요에 따라
는 : 가들이 generic, std::advance(it,2)
를 사용
당신이 필요합니다. 누군가가 따라오고 std::vector
을 std::list
으로 변경하면 코드가 계속 컴파일되지만 일정 시간이 아닌 선형 시간이 걸립니다.
당신이 성능 필요한 경우, it+=2
를 사용합니다. 누군가 std::vector
을 std::list
으로 변경하면 심각한 성능 문제가 발생하여 코드를 컴파일하지 못해 도움이되는 의견을 나타낼 수 있습니다.
컨테이너를 변경하지 않으려 고하고 (아마도 그렇지 않은 경우)보기 쉽고 이해하기 쉬우 며 코드를 덜 어둡게 남겨두기 때문에 +를 사용하십시오.
컨테이너를 변경하려는 경우 또는 다양한 컨테이너 유형에서 인스턴스화 할 수있는 템플릿 내부에서 작업하는 경우 아무 것도 작동하지 않으므로 advance를 사용하십시오.
일반적으로 컨테이너 유형을 변경해야 할 때 컨테이너가 사용되는 모든 곳을 다시 방문하게되는 것을 발견했기 때문에 컨테이너 유형을 변경하는 것에 대해 걱정하지 않아도됩니다. 갑자기 어리석은 일을하지 않습니다. (목록의 중간에서 임의로 요소를 뽑아내는 것과 같이).
반면에 덜 일반적인 코드를 사용하면 의도하지 않은 코드 축소를 막을 수 있습니다. 결국 목록 컨테이너로 "임의 액세스"를 많이하는 것이 좋지 않을 수 있습니다. – UncleBens