C++(21): C++:std::vector与std::deque比较

        std::vector和std::deque都是C++标准库中的容器,它们有一些相似之处,但也有很多重要的区别。以下是它们的相同点和不同点,以及各自的优点。

1. 相同点

(1)动态数组

        std::vector和std::deque都是动态数组,可以在运行时动态地增加和删除元素。

(2)随机访问

        两者都支持随机访问,即可以在常数时间内访问任意位置的元素。

(3)存储相同类型的元素

        它们都存储相同类型的元素,这些元素在内存中连续存储。

2. 不同点

(1)内存分配

        std::vector在内存中分配一块连续的空间来存储元素,当添加新元素时,如果当前已分配的内存空间不足以容纳新元素,std::vector会重新分配一块更大的内存空间,并将旧空间的元素复制到新空间,然后释放旧空间。这可能导致大量的数据复制和可能的内存碎片。相反,std::deque是分块的,它使用多个固定大小的块在内存中存储元素,当需要添加新元素时,它会添加一个新的块,而不是重新分配整个内存空间。这使得std::deque在添加或删除元素时更加高效。

(2)时间复杂度

        对于std::vector,在尾部添加/删除元素的平均时间复杂度是常数的,但在头部或中间插入/删除元素的时间复杂度是线性的,因为需要移动插入/删除点之后的所有元素。而对于std::deque,在头部和尾部添加/删除元素的平均时间复杂度都是常数的,但在中间插入/删除元素的时间复杂度仍然是线性的。

(3)空间效率

        由于std::vector需要连续的内存空间,因此在某些情况下,它可能比std::deque更加空间高效。然而,当需要在std::vector的中间插入大量元素时,这可能会导致大量的数据复制和内存浪费。相反,std::deque使用的分块存储方式可能会导致一些内存碎片,但它在添加或删除元素时通常更加高效。

3. 各自的优点

(1)std::vector

* 内存使用更高效,因为它在内存中分配一块连续的空间。

* 尾部添加/删除操作非常快,时间复杂度为O(1)。

* 随机访问性能好。

(2)std::deque

* 在头部和尾部添加/删除操作都非常快,时间复杂度为O(1)。这使得它非常适合作为队列或双端队列使用。

* 内存管理更加灵活,不需要像`std::vector`那样在添加新元素时可能需要进行大量的数据复制。

* 随机访问性能好。

4. 各自的缺点

(1)std::vector 

* 内部插入和删除效率低:当在std::vector的中间位置插入或删除元素时,需要移动插入或删除点之后的所有元素,这导致操作的时间复杂度为O(n),在大量数据的情况下效率较低。

* 扩容代价:当std::vector需要扩容时,它会申请一块更大的连续内存空间,将原有数据复制到新空间,并释放旧空间。这个过程中涉及大量数据的拷贝,可能会带来一定的性能开销,并且可能导致内存碎片。

* 连续内存依赖:std::vector要求内存空间连续,这在某些情况下可能导致内存分配失败,尤其是在处理大量数据时。

(2)std::deque

* 内存占用较多:由于std::deque是分块存储的,每块内部还需要额外的空间来存储指向前后块的指针等信息,因此相对于std::vector,它可能会占用更多的内存空间。

* 随机访问性能稍差:虽然std::deque也支持随机访问,但由于元素分布在多个块中,访问不同块的元素可能需要更多的指针操作,因此其随机访问性能相对于std::vector来说稍差一些。

* 不适合频繁的内部插入和删除:尽管std::deque在头部和尾部的插入和删除操作高效,但在中间位置进行插入和删除仍然需要移动元素,效率较低。

        以上,需要注意的是,所有的优缺点并不能绝对看待,而是要根据实际的应用场景来衡量,并决定选用哪一种方式来存取数据。

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值