C++ vector遍历方法,哪个最快


四种方式

  • 下标
  • 迭代器
  • auto迭代器
  • for range
#include <iostream> 
#include <vector> 
#include <stdint.h> 
#include <ctime> 
 
int main() 
{ 
    const uint32_t loop = 10000000; 
    std::vector<int32_t> vec; 
    clock_t timeStart = 0; 
    for (uint32_t i = 0; i < loop; ++i) 
    { 
        vec.push_back(i); 
    } 
    // test time use 
    // 1.by index 
    timeStart = clock(); 
    uint64_t sum1 = 0; 
    for (uint32_t i = 0; i < vec.size(); ++i) 
    { 
        sum1+=vec[i]; 
    } 
    std::cout << sum1<<" "<< clock() - timeStart << "ms" << std::endl; 
    // 2.by iterator 
    timeStart = clock(); 
    uint64_t sum2 = 0; 
    for (std::vector<int32_t>::const_iterator it = vec.begin(); it != vec.end(); ++it) 
    { 
        sum2 +=*it; 
    } 
    std::cout << sum2 << " " << clock() - timeStart << "ms" << std::endl; 
    // 3.by auto iterator 
    uint64_t sum3 = 0; 
    timeStart = clock(); 
    for (auto it = vec.begin(); it != vec.end(); ++it) 
    { 
        sum3 += *it; 
    } 
    std::cout << sum3 << " " << clock() - timeStart << "ms" << std::endl; 
 
    // 4.by for range 
    uint64_t sum4 = 0; 
    timeStart = clock(); 
    for (const auto & it :vec) 
    { 
        sum4 += it; 
    } 
    std::cout << sum4 << " " << clock() - timeStart << "ms" << std::endl; 
    
    return 0; 
} 

VS2019

debug

loop=1kw

49999995000000 354ms 
49999995000000 3867ms 
49999995000000 4089ms 
49999995000000 18ms    为什么这种写法最快?

forrange最快。index比iterator快10倍,auto iterator略慢于iterator。

release

loop=1kw

49999995000000 12ms 
49999995000000 13ms 
49999995000000 14ms 
49999995000000 4ms

forrange仍然最快,其他3个差不多,约为forrange的3倍


loop=10kw

4999999950000000 118ms 
4999999950000000 130ms 
4999999950000000 129ms 
4999999950000000 33ms

同上

gcc 4.8.5

debug

loop=1kw

 g++ -DDEBUG  -std=c++11  -g main.cpp       
./a.out                               
49999995000000 80ms   为什么这种写法最快?
49999995000000 240ms 
49999995000000 240ms 
49999995000000 180ms

index最快


loop=10kw

g++ -DDEBUG  -std=c++11  -g main.cpp
./a.out                          
4999999950000000 740ms 
4999999950000000 2350ms 
4999999950000000 2450ms 
4999999950000000 1800ms 

同上

release

loop=10kw

g++   -std=c++11 -O2  main.cpp  
4999999950000000 50ms 
4999999950000000 40ms 
4999999950000000 40ms 
4999999950000000 40ms 

4种写法都差不多

结论

优化后,vs for range最快,gcc 4种写法几乎没区别。
for range遍历vector是最快的一种写法。跨平台时,优先选for range。
尽量用新版本特性,语法简单,性能也好。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM