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。
尽量用新版本特性,语法简单,性能也好。

posted @   天下太平  阅读(2541)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示