首页 > 编程语言 >【C++】常用序列式容器迭代器自增效率实测

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

时间:2024-03-26 13:30:11浏览次数:214  
标签:__ return 迭代 ++ Self 器自增 C++ vector

常用序列式容器包括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的方式。

标签:__,return,迭代,++,Self,器自增,C++,vector
From: https://blog.csdn.net/Wait_Godot/article/details/137042479

相关文章

  • C++面向对象整理(9)之类型转换 dynamic_cast、static_cast、const_cast及其安全性
    C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast注:整理一些突然学到的C++知识,随时mark一下例如:忘记的关键字用法,新关键字,新数据结构C++的类型转换C++面向对象整理(9)之C++的类型转换dynamic_cast、static_cast、const_cast一、C++的类型转换......
  • 函数是什么?C++函数详解!
    1、函数的声明和定义在复杂的程序中,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿。把任务分工到其它的函数中,main函数只负责程序的核心流程,具体的任务由其它函数完成。这种思想就是模块化编程。声明和定义函数的语法:返回值的数据类型函数名(参数一的数据类型......
  • C++ 23 新特性概览之 标准库
    文章目录C++23新特性概览之标准库简介关于环境字符串格式化改进标准库模块`importstd``importstd.compat``basic_string(_view)::contains()`禁止从`nullptr`构造`string(_view)``basic_string::resize_and_overwrite(count,op)``std::optional`的链式调用`S......
  • C++11标准模板(STL) 算法(std::reverse)
    定义于头文件<algorithm>算法库提供大量用途的函数(例如查找、排序、计数、操作),它们在元素范围上操作。注意范围定义为 [first,last) ,其中 last 指代要查询或修改的最后元素的后一个元素。逆转范围中的元素顺序std::reverse1)反转[first,last)范围中的元素顺序表......
  • C++ std::reverse函数
    函数原型,定义std::reverse定义于头文件 <algorithm>1(1)2template<classBidirIt>3voidreverse(BidirItfirst,BidirItlast);(C++20前)45template<classBidirIt>6constexprvoidreverse(BidirItfirst,BidirItlast);(C++20起)......
  • C++的四种强制类型转换符,看了就懂
    运行时类型检查转换dynamic_cast用途及条件1、基类要有虚函数2、主要用于“安全地向下转型”解释1、为什么基类要有虚函数?答:dynamic_cast在运行时会进行类型检查,这种检查不是语法上的检查,而是真实情况地检查。如何检查?如果代码中使用了强制类型转换dynamic_cast,编译器会......
  • C++缺省参数与函数重载
    1.缺省参数1.1定义即函数声明或定义时为函数指定一个缺省值,如果调用函数时传入参数,则变量的值为实参的值,如果调用时未传入参数,则变量的值为缺省值。//其中a=0即为定义的缺省值voidFun_test(inta=0){ cout<<"a="<<a<<endl;}intmain(){//传入参数,a......
  • 用Dev C++实现NOKIA经典游戏贪吃蛇
    前期准备头文件:#include<bits/stdc++.h>#include<stdio.h>#include<conio.h>#include<windows.h>控制界面配置:voidcolor(intx){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);}//设置不同颜色voidHide(){ HANDLEhOut; CONSOLE_CUR......
  • 学会在 C++ 中使用变量:从定义到实践
    C++变量变量是用于存储数据值的容器。在C++中,有不同类型的变量(使用不同的关键字定义),例如:int-存储整数(没有小数点),例如123或-123double-存储浮点数,带有小数点,例如19.99或-19.99char-存储单个字符,例如'a'或'B'。字符值用单引号括起来string-存储文本,例如......
  • C++调用C# (使用C++/CLI)
    简介C++/CLI简介见上文 C#调用C++(使用C++/CLI)-咸鱼翻身?-博客园(cnblogs.com)新建解决方案->CPlusCSharpSolution新建C#类库->CSharpNative新建类NativeCalculate1publicclassNativeCalculate2{3publicintAdd(inta,intb)4{......