【C++】常用序列式容器迭代器自增效率实测

常用序列式容器包括vector、list、deque。本篇文章就来评析它们的迭代器,不同自增方式效率的不同。

在看这篇文章之前,大家可以先看看这篇文章:【C++】自增运算符重载及其效率问题-CSDN博客,了解一下之前得出的结果。前面的文章其中一个结论是,在自定义类型的自增(自减)运算符重载时,++i往往比i++效率更高。这篇文章旨在验证这一点。

测试代码:

#include <bits/stdc++.h>
#include <synchapi.h>
using namespace std;

int main(){
    vector<int>v(20000,1);//这里依次换为其他容器即可,其他部分不需要变
    double start,end;//记录时间
    for (int k = 0; k < 5; ++k) {//重复测试5次
        start=clock();
        for (auto i=v.begin();i!=v.end();++i){
            for (auto j=v.begin();j!=v.end();++j){
                ;
            }
        }
        end=clock();
        cout<<format("++i共耗时{:.2f}秒",(end-start)/1000)<<endl;//++i耗时
        Sleep(2000);
        start=clock();
        for (auto i=v.begin();i!=v.end();i++){
            for (auto j=v.begin();j!=v.end();j++){
                ;
            }
        }
        end=clock();
        cout<<format("i++共耗时{:.2f}秒",(end-start)/1000)<<endl<<endl;//i++耗时
    }
    return 0;
}

注意!如果没有用万能头文件的话,则需包含好相应的头文件,比如clock()<ctime>vector<vector>

vector迭代器实测

vector应该是大家最熟悉的序列式容器了。在这里将其迭代器的自增运算符展示在这里。后面的容器也是一样,不再赘述。

源代码(补充一下,vector的迭代器直接继承通用迭代器的设计,它的自增操作并没有包含在<stl_vector.h>里面,而是在<stl_iterator.h>里面):

_GLIBCXX20_CONSTEXPR
    __normal_iterator&
    operator++() _GLIBCXX_NOEXCEPT
{
    ++_M_current;
    return *this;
}

_GLIBCXX20_CONSTEXPR
    __normal_iterator
    operator++(int) _GLIBCXX_NOEXCEPT
{ return __normal_iterator(_M_current++); }

测试结果:

image-20240325185952415

可以看到,vector的i++++i更耗时。

list迭代器实测

list容器实现了链表。

源代码:

_Self&
    operator++() _GLIBCXX_NOEXCEPT
{
    _M_node = _M_node->_M_next;
    return *this;
}

_Self
    operator++(int) _GLIBCXX_NOEXCEPT
{
    _Self __tmp = *this;
    _M_node = _M_node->_M_next;
    return __tmp;
}

测试结果:

image-20240325185827181

可以看到,list的i++++i更耗时。

deque迭代器实测

deque容器实现了双端队列。

源代码:

_Self&
    operator++() _GLIBCXX_NOEXCEPT
{
    ++_M_cur;
    if (_M_cur == _M_last)
    {
        _M_set_node(_M_node + 1);
        _M_cur = _M_first;
    }
    return *this;
}

_Self
    operator++(int) _GLIBCXX_NOEXCEPT
{
    _Self __tmp = *this;
    ++*this;
    return __tmp;
}

测试结果:

image-20240325190245648

可以看到,deque的i++++i更耗时。

结果分析

可以看到,vector、list、deque的测试结果与上一篇文章的分析结果一致,均为i++++i更耗时,从它们的源代码中也印证了这一点。因此,如果以后需要写迭代器自增(自减也是一样)的话,推荐使用++i的方式。

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Forgotten Legend

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值