2012-04-03 4 views
0

가능한 중복 :
C++ STL: Which method of iteration over a STL container is better?
Efficiency of vector index access vs iterator access반복이나 간단한 루프 카운터를 사용하면 어느 것이 더 빠릅니까?

std::vector<int>numbers라는 가정은 다음 중 빠른?

for (vector<int>::iterator i = numbers.begin(); i != numbers.end(); i++) 
    cout << *i; 

나 ..이

for (int i = 0; i < numbers.size(); i++) 
    cout << numbers.at(i); 

어느 것이 더 빠르다? 중요한 차이가 있습니까?

+2

어떤 것이 더 빠르지는 모르지만 거의 중요하지는 않습니다. – Oleksi

+3

cout이 FAR의 제한 요소가 될 것입니다. 터미널에 모두 인쇄하는 경우 속도 차이를 보여주는 벤치마킹 프로그램을 만들지 않습니다. –

+0

필자는 시스템에서 이와 비슷한 테스트를 실행하여'at()'가 가장 느린 메소드 (범위 검사에서)로, 반복자가 빠르며 인덱스와'[] '를 사용하여 속도가 가장 빠름을 발견했습니다. 그것은 아마 당신의 시스템과 컴파일러에 달려 있습니다. – kappamaki

답변

1

두 개는 비교할 수 없습니다. 전자는 각 요소를 반복하며, 후자는 현재 색인이 유효한지 확인하면서 반복합니다 (at() 포함). 수표를 꺼내서 다시 질문하십시오.

for (/* Not an int! Unsigned type: */ std::size_t i = 0; i < numbers.size(); i++) 
    cout << numbers[i]; 

이제는 똑같은 일을합니다. 이제 문제는 중복됩니다 (# 1 # 2). 요약하면 : 그것은 중요하지 않습니다.

+0

오. 'size_t'는'int' 또는'unsigned int'보다 바람직합니까? 난 몰랐어. 어쨌든 감사합니다! –

+1

@JonathanLingle size_t는 컴파일러가 서명 된 int와 서명되지 않은'.size()'의 결과를 비교할 때 경고 메시지를 보내는 것을 방지하기 위해서만 중요합니다. int를 사용하면 작업 할 수있는 컨테이너의 크기도 제한되지만 일반적으로 int의 범위이면 충분합니다. – bames53

1

차이점은 하드웨어와 컴파일러에 따라 달라 지므로 측정해야합니다. 비 최적화 컴파일러를 사용하는 이국적인 하드웨어를 제외하고는 큰 차이가 없을 것으로 기대됩니다.

물론 루프 오버 헤드보다 IO가 훨씬 더 중요합니다.

관련 문제