zoukankan      html  css  js  c++  java
  • 序列容器

    1、序列容器

    (1)vector

     vector和built-in数组类似,拥有一段连续的内存空间,能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝。

    另外,当插入较多的元素后,预留内存空间可能不够,需要重新申请一块足够大的内存并把原来的数据拷贝到新的内存空间。这些影响了vector的效率,但是实际上用的最多的还是vector容器,建议大多数时候使用vector效率一般是不错的。

    (2)list

    list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。

    (3)deque

    deque是一个double-ended queue,它的具体实现不太清楚,但知道它具有以下两个特点:它支持[]操作符,也就是支持随即存取,并且和vector的效率相差无几,它支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。

    2、特点

    (1)vector

    优点:

    随机存取,即[]操作和vector.at()

    动态操作,push_back()与pop_back()

    自动调整内存,节省空间

    缺点:

    实现插入与删除操作效率低

    只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比。

    当动态添加的数据超过默认内存大小时,要进行整体的重新分配,拷贝与释放。

    (2)list

    优点:

    内存不连续

    动态操作,插入与删除效率高

    可在两端进行pop,push

    缺点:

    不能随机访问

    相对于vector占用内存多

    (3)deque

    优点:

    随机访问,即[]操作和deque.at()

    插入与删除方便

    可在双端进行pop,push

    缺点:

    占用内存多。

    3、联系区别

    (1)联系

    三者都能实现resize()来重新调整容器的大小。

    (2)区别

    1)vector能实现随即存取,即[]操作,而list不能,deque是二者的结合体,也能够实现索引操作[],但效率没有vector高。

    2)vector适合在文件的末尾实现删除元素的操作pop_back()与插入操作push_back(),在中间时效率非常低下。而list可以在容器的任何位置实现插入与删除操作。

    原因:vector的元素地址连续,如果在中间插入与删除操作,可能会导致原来的内存地址不足以存储当前的元素,需要重新分配内存地址,这就需要将原来的所有元素拷贝到新内存,释放旧的内存地址等操作,操作代价高昂。而list元素内存地址不连续,用指针操作,其本身是一个双向链表,它的高效率体现在插入,删除以及排序等移动大量元素的操作。

    4、选择容器类型的准则

    1. 如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

    2. 如果你需要大量的插入和删除,而不关心随即存取,则应使用list

    3. 如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。

  • 相关阅读:
    python基础---内置类型
    python基础---内置常量
    python基础---内置函数
    数据增强---CutMix
    数据增强---Mixup
    机器学习笔记---评估方法
    深度学习笔记-上溢和下溢
    线性代数笔记-子空间
    tensorflow2学习笔记---模块、层和模型
    tensorflow2学习笔记---Graph和tf.function
  • 原文地址:https://www.cnblogs.com/yedushusheng/p/5519892.html
Copyright © 2011-2022 走看看