2016-10-20 2 views
1

C++ 초보자로서 필자는 반복기를 발견하고 있습니다. 모든 컨테이너를 통해 루프에 대해 int 또는 iterators을 사용할 수 있음을 알고 있습니다. C++의 정수 또는 반복기 반복과의 차이점

  • 하나 또는 다른 방법을 사용하여 임의의 이점이있다, 예
    i is an int: 1 4 8                                 
    i is an iterator: 1 4 8 
    

    는 일반적으로 출력

    #include <iostream> 
    #include <vector> 
    
    int main() 
    { 
        std::vector<int> v; 
        v.push_back(1); 
        v.push_back(4); 
        v.push_back(8); 
    
        std::cout << "i is an int: "; 
        for (int i = 0; i<v.size();i++) 
        { 
         std::cout << v[i] << " "; 
        } 
        std::cout << std::endl; 
    
        std::cout << "i is an iterator: "; 
        for (std::vector<int>::iterator i = v.begin(); i!=v.end();i++) 
        { 
         std::cout << *i << " "; 
        } 
        std::cout << std::endl; 
    } 
    

    고려해야?

  • 하나가 다른 것보다 빠릅니까?
  • 언제 int을 사용해야하며 언제 iterator을 사용해야하나요?
+1

C++ 11 이후, 범위를 지정하기 위해 : for (int e : v) {std :: cout << e << "" "; }' – Jarod42

+1

그리고'auto i = v.begin()'도 할 수 있으므로 타입의 상대적으로 복잡한 이름을 지정할 필요가 없습니다 – ForceBru

+0

'int' 버전은 모든 컨테이너에서 일반화 될 수 없습니다 ('list','set' 등), iterator (그리고 위의 범위를 기반으로 함)가 될 수 있습니다. – Chad

답변

2

가장 큰 이유는 일반성을 제공하는 것입니다 :

대신 알고리즘의 원시 루프를 사용하여 이전 스타일의 루프에 ranged-for 루프를 선호합니다. 특히, 일반적인 알고리즘은 유형이 템플릿 매개 변수로 전달되는 반복자 사용하여 컨테이너의 다양한 이동할 수 있으므로 인쇄 할 수 있기 때문에

template <class InIt> 
void print(InIt b, InIt e) { 
    while (b != e) { 
     std:cout << *b << ' '; 
     ++b; 
    } 
} 

당신이 반복자로부터 이점을 얻을이 경우를 list 또는 map (단지 몇 가지 예를 들자면) vector 일뿐입니다.

알려진 유형의 컨테이너로 직접 작업하는 경우 실제로 문제가되지 않습니다. 실제로는 vector에있는 항목을 인쇄하려는 경우 정수로 색인을 작성하면 완벽하게 정상적으로 작동합니다. 반복기 대신 색인을 사용하면 내용을 읽는 대신 모음을 수정하는 경우 이점이 있습니다. 예를 들어 루프 내부의 벡터에 push_back을 수행 할 수있는 경우 정수 인덱스가 유효하지만 반복기는 무효화 될 가능성이 있습니다 .

for (auto i : v) 
    std::cout << i << ' '; 

1. 참고 : 표시 한 경우를 들어

은, 그러나, 당신은 아마 인덱스 또는 반복자를 사용하지 않도록 범위 기반 for 루프를 고려할 표준 반복자에 대해서는 사실이지만 입니다.이 상황에서 유효한 반복자 유형을 만들 수 있습니다. 실제로 필요하거나 원할 경우 가능합니다. 예를 들어 하나 또는 다른 방법을 사용하여 어떤 장점이있다 : https://stackoverflow.com/a/7958561/179910

1

때때로 알고리즘은 인덱스를해야하고,이 경우 인덱스를 추적하기 int, 또는 size_t을 사용합니다. 그렇지 않으면 반복기를 사용하십시오. 또한 일부 컨테이너는 반복자로만 트래버스 될 수 있습니다. list, map

0

반복기가 더 일반적입니다. 반복자를 사용하여 합리적으로 인덱싱 할 수없는 시퀀스를 반복 할 수 있습니다 (이 때문에 여러 개의 std::iterator categories이 있습니다). 예를 들어, 표준 입력은 istream_iterator 이상으로 반복 될 수 있으며 std::list은 색인을 지원하지 않습니다.

반면에 인덱스는 컴파일러가 쉽게 최적화 할 수 있지만 인터페이스면에서는 훨씬 엄격합니다.

반복자의 사용법은 최신 C++에서 유비쿼터스이며 나쁜 기본값은 아닙니다. 특히 유형 공제를 사용하여 귀찮게 긴 유형의 이름을 지정하지 않아도되므로 특히 그렇습니다. 반복자에 대한

for(auto const& elem : range){ 
    //... 
} 
0

Similar question already exists 날 당신은 한 번에 하나의 의문을 제기 대답하려고하자? int를 사용해야하는시기와 반복자를 사용해야하는시기는 언제입니까? 정수를 사용할 수없고 반복기를 사용해야하는 경우가 있습니다 !! 그러나 이터레이터는 일반적으로 정수보다 느립니다.

What are the best and common practices? 

알고리즘에 따라 다릅니다. 고정 크기 배열을 반복하는 경우 정수를 사용하고 간단하고 쉽습니다. STL을 사용하거나 자신의 데이터 구조 (인스턴스로 링크 목록)를 개발하는 경우 최상의 선택은 반복자를 사용하는 것일 수 있습니다.