C++ vector遍历方法,哪一个更快

C++ vector遍历方法,哪一个更快

三种方式

  • 下标
  • 迭代器、auto迭代器
  • for arrange

先说结论: linux系统 下标最快,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 << "clock" << 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 << "clock" << 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 << "clock" << std::endl; 
 
    // 4.by for range 
    uint64_t sum4 = 0; 
    timeStart = clock(); 
    for (const auto & it :vec) 
    { 
        sum4 += it; 
    } 
    std::cout << sum4 << " " << clock() - timeStart << "clock" << std::endl; 
    
    return 0; 
} 

ubuntu-debug

运行速度: 下标 > for range >迭代器(两种迭代器时间相近)

$ g++ -DDEBUG  -std=c++11  -g 000.cpp 
$ ./a.out 
49999995000000 33981clock
49999995000000 105629clock
49999995000000 104902clock
49999995000000 77303clock

$ ./a.out 
49999995000000 34418clock
49999995000000 105661clock
49999995000000 105600clock
49999995000000 76512clock

ubuntu-release

几种方式时间大致相同

$ g++ -std=c++11 -O2 000.cpp 
$ ./a.out 
49999995000000 5626clock
49999995000000 5173clock
49999995000000 4983clock
49999995000000 4813clock

$ ./a.out 
49999995000000 4123clock
49999995000000 4988clock
49999995000000 5211clock
49999995000000 5929clock
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值