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

参考: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、array、数组、new创建的动态数组,你到底该用哪一个

参考:https://blog.****.net/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函数交换两者元素