vector、array、数组、new创建的动态数组,你到底该用哪一个

本文详细解析了C++中的vector容器,对比了数组、动态数组与vector的区别,阐述了vector的工作原理及其效率问题,同时提供了实用建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:http://www.cnblogs.com/chhuach2005/p/3627011.html

  • 数组:底层数据类型,存放在栈中,其内存的分配和释放完全由系统自动完成,效率最高
  • 动态数组:程序员由new运算符创建的,存放在堆区,需要delete运算符人工释放,否则会造成内存泄露
  • vector:存放在堆中,由STL库中程序负责内存的分配和释放,使用方便

代码执行时间:vector > 预先reverse的vector > 动态数组 > 数组,其中数组的执行效率是vector的10倍左右

vector效率低原因:vector的动态自增,并不是在原空间之后接续新空间,而是在原空间不够使用时,以原空间大小的两倍另外配置一块大空间,然后将原内容拷贝过来,再在新拷贝的原内容之后构造新元素,并释放原空间。这是vector效率低的主要原因。
注意:对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器都失效了。此外,还要注意size和capacity的区别,size指容器当前拥有的元素个数,capacity指容器在必须分配新存储空间之前可以存储的元素总数,capacity总是大于或等于size。下图是vector的构造和内存管理示意图(来自STL源码剖析),
vector的构造和内存管理示意图

参考:https://blog.youkuaiyun.com/zyr4712008/article/details/8686565
vector与数组的区别
C++ primer的作者说到,在实际的编程中,我们作为程序员应该避免用到低级数组和指针,而更应该多用高级的vector和迭代器。在程序强调速度的情况下,我们程序员可以在类的内部使用数组和指针。

数据结构vector数组array
相同点都是对同一种类型的数据进行储存
都可以用下标操作进行处理
都可以用迭代器进行操作(C++中每个容器都配有各自的迭代器)
不同点可以用size获取vector的长度不可以获取,在定义时就已经确定了长度可以用size获取vector的长度,但该值在定义时就已经确定了
长度不固定,可以随时增加长度固定,在定义时就不可以更改长度固定,在定义时就不可以更改
可以在末尾增加vector的元素(用push_back)不能增加在长度以外的元素不能增加在长度以外的元素
可以确定长度,节约空间不能确定长度,必须在定义时定义一个很大的空间留给数组,造成内存的浪费
访问方式更安全,新增begin、end、at等只能通过下标、指针进行访问访问方式更安全,新增begin、end、at等
可以使用拷贝和赋值进行初始化只能使用赋值进行初始化可以使用拷贝和赋值进行初始化
可以使用swap函数交换两者元素只能使用赋值进行初始化循环进行交换可以使用swap函数交换两者元素
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值