1、vector
(1)定义
vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。
vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
(2)底层实现
在内存中分派一块连续的内存空间进行存储。支持不指定vector大小的存储。
STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacity()函数返回的大小,当超过分配的空间时再整体重新分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉(实际上是对于大数据存储是自动重新分配了)。通常默认的内存分配能完成大部分情况下的存储。
很多时候我们不必要知道vector里面有多少数据,vector里面的数据是动态分配的,使用push_back()的一系列分配空间常常决定于文件或一些数据源。如果你想知道vector存放了多少数据,你可以使用empty()。获取vector的大小,可以使用size()。
例如,如果你想获取一个vectorv的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为-1,你可以使用下面的代码实现:
(3)使用
为了可以使用vector,必须在你的头文件中包含下面的代码:
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
或者连在一起,使用全名:
建议使用全局的命名域方式:
(4)特点
优点:(1)随机存取,即[]操作和vector.at();
(2)动态操作,push_back()与pop_back();
(3)自动调整内存,节省空间。
缺点:(1)实现插入与删除操作效率低;
(2)只能在尾部插入与删除,在头部插入与删除消耗时间规模与容器大小成正比;
(3)当动态添加的数据超过默认内存大小时,要进行整体的重新分配,拷贝与释放。
(5)vector VS 数组
数组:
分配的是静态空间,一般分配了就不可以改变,就像我们熟知的定义了一个数组,那么数组的长度就不可以改变了。
不可以进行越界访问,但是编译器不检查越界,这一点在我们编程的时候要尤为注意(常见错误!)。一般申请的数组长度不能满足我们的要求了,我们要重新申请大一点数组,然后把原数组中数据复制过来。
vector:
分配的是动态空间,即:我们发现在声明vector容器的时候也可以不指定容器的大小,vector是随着元素的加入,空间自动扩展的。
但是,我们必须要负责任的肯定vector分配的空间是连续的,也就是支持数组中的下标随机访问,实际上vector的实现机制是:预留一部分空间,而且预留空间的大小是按一定比率增长的,如果空间不够用的话,要保证连续,就必须重新new一片空间,然后将原有元素移动到新空间,同时预留新的空间(并且新分配的空间比原来分配的空间),最后将原来的那部分空间释放掉。这样预留空间的好处就是不用每次向vector中加元素都重新分配空间。
2、vector成员函数
(1)构造函数、析构函数
示例:
(2)赋值操作
示例:
(3)插入操作
示例:
(4)删除操作
示例:
(5)定位操作
示例:
(6)数据大小
示例:
(7)交换操作
/*交换操作*/ c1.swap(c2) //将c1和c2元素互换。 swap(c1,c2) //同上操作。
示例: