美文网首页
C++优化:array, vector, 和 list,选择正确

C++优化:array, vector, 和 list,选择正确

作者: fck_13 | 来源:发表于2020-03-28 02:35 被阅读0次

    这三个是C++中比较常用的顺序容器,如何选择这三个是一个值得探讨的问题。
    关于std::array的介绍,请花两分钟看一下我的另一篇文章C++11:array

    三种容器各自的特点:

    • std::array:元素占用的空间是在栈上分配的,大小固定不变,,内存连续,可随机存取。是对静态数组的封装。封装后占用的内存与封装前是一样的。
    • std::vector:元素占用的空间是在堆上分配的,大小是可以改变的,每当容器需要扩大时,都会按照相同的系数进行扩大,内存连续,可随机存取。是对动态数组的封装。封装后占用的内存比封装前要大,一般是多两个指针的大小。
    • std::list:元素占用的空间是在堆上分配的,空间是按需分配的,用到一个元素的空间,就分配一个元素的空间。不能随机存取,可双向存取。list的每个元素中都要包含一个指向下个元素的指针。

    选择:
    (1)如果你的元素个数确定且数量不是很大,应使用std::array,在存取速度和内存占用上,相对静态数组是没有消耗的,且类型安全。
    (2)如果你的元素个数不确定,但是元素个数的变化频率比较低,这时候应选择使用std::vector。存取速度上相对与动态数组是没有消耗的。但是(1)一般默认会多两个指针的内存大小,原因是记录当前std::vector的大小之类的状态(2)当元素个数达到std::vector的最大容量时,std::vector会重新分配新的足够的空间来储存数据,并将旧的数据拷贝到新分配的空间中,这两点会带来一定的消耗。
    (3)如果你的元素个数不确定,并且元素的个数变化的频率比较高,这时候选择使用std::list
    (4)由于std::list不是随机存取的,所以不能使用stl中的std::sort函数。这时候要考虑另外两种容器或者自己写sort函数了。

    最后给大家看一下,构造含有两个元素的三种容器的汇编代码:


    image.png

    相关文章

      网友评论

          本文标题:C++优化:array, vector, 和 list,选择正确

          本文链接:https://www.haomeiwen.com/subject/yyjgnctx.html