벡터 요소를 반복 할 때는 인덱스 대신 반복자를 사용하는 것이 좋습니다 (Why use iterators instead of array indices? 참조).반복자를 사용하여 벡터에 인덱스 가져 오기
std::vector<T> vec;
std::vector<T>::iterator it;
for (it = vec.begin(); it != vec.end(); ++it)
{
// do work
}
그러나 루프 본문에서 인덱스를 사용해야 할 수 있습니다. 성능 및 유연성/확장 성을 고려하여 다음 중 어느 것이 더 좋을까요? 인덱스 루프
- 되돌리기
std::vector vec; size_t i; for (i = 0; i < vec.size(); ++i) { // use i }
- 계산은
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = it - vec.begin(); // use i }
- 사용 표준 : 거리
std::vector vec; std::vector::iterator it; for (it = vec.begin(); it != vec.end(); ++it) { size_t i = std::distance(vec.begin(), it); // use i }
은 모든 반복자 작동하기 때문에 표준 : 거리를 사용하여 좀 더 일반적이다
일반적으로 인덱스 된 루프가 더 나은 성능을 가지고 있다고 가정하는 것이 안전하지만 두 경우 모두 성능이 매우 비슷할 것이다. – Guvante
나는 동의 할 수 없다. 루프의 본문에는 반복기를 참조 해제하는 다른 코드가 포함될 수 있습니다. 반복자는 코드를 단순하게 만들 의도가 없으며 코드를보다 일반적으로 만듭니다. 이터레이터를 사용하면 목록의 벡터를 바꿀 수 있으며 여전히 작동합니다. – QBziZ
또한 std :: map 또는 std :: set 반복자는 매우 어리 석다. 가능한 모든 키를 반복하면 아마도 영원히 걸릴 것입니다. 또한 모든 키에 O (log (n)) 조회를 수행해야합니다. 따라서 루프는 O (m * log (n))를 취할 것입니다. 반복기를 사용하면 O (n) 시간에 컬렉션을 반복 할 수 있습니다. –