【C++】关于STL中list、deque、vector的插入删除的时间复杂度的比较

一、vector

        是动态数组,在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放;如果新值大于当前大小时才会重新分配内存。

扩容方式:
                1、倍数开辟二倍的内存
                2、旧的数据开辟到新内存
                3、释放旧的内存
                4、指向新内存

时间复杂度:

 

特点:

  • 拥有一段连续的内存空间,并且起始地址不变,因此能够非常好的支持随机存取,即[]操作符,但是由于它的内存空间是连续的,所以在头部和中间进行插入和删除操作会造成内存块的拷贝,另外,当该数组的内存空间不够时,需要重新申请一块足够大得内存并且进行内存的拷贝,这些都大大的影响了vector的效率。
  • 对头部和中间进行添加删除元素操作需要移动内存,如果你得元素是结构或类,那么移动的同时还会进行构造和析构操作,所以性能不高
  • 对任何元素的访问时间都是O(1)
  • ,所以常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作
  • 属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存,如push_back 1000个元素,capacity返回值为16384
  • 对最后元素操作最快(在后面添加删除元素最快),此时一般不需要移动内存,只有保留内存不够时才需要

二、list(双向循环链表)

        元素存放在堆中,每个元素都是放在一块内存中,他的内存空间可以是不连续的,通过指针来进行数据的访问,这个特点使得它的随机存取变得非常没有效率,因此它没有提供[]操作符的重载。但是由于链表的特点,它可以很有效率的支持任意地方的删除和插入操作。

优点:可以在任意位置进行插入删除

缺点:访问效率低

时间复杂度:

特点:

  • 没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存;
  • 在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机插入和删除操作容器;
  • 访问开始和最后两个元素最快,其他元素的访问时间都是O(n);
  • 如果经常进行添加和删除操作并且不经常随机访问的话,使用list。

 

三、deque(双端队列)

        是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问,但它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪。向deque 两端添加或删除元素的开销很小。它不需要重新分配空间,所以向末端增加元素比vector 更有效。

deque 是对vector 和list 优缺点的结合,它是处于两者之间的一种容器。

时间复杂度:

特点:

  • 随机访问方便;
  • 可以在内部进行插入和删除操作;
  • 可以在两端进行push和pop。
  • 35
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值