1.1 vector介绍
1.2 vector使用
1.2.1vector 的构造函数声明
1.2.2 vector迭代器的使用
1.2.3vector 的空间相关
1.2.4 vector的增删查改
2.1 vector迭代器问题
1.1 vector介绍:
1. vector是表示可变大小数组的序列容器。意思是,vecotr本质上类似一个数组,是一串连续的空间。
2.vector也采用的连续存储空间来存储元素,可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
3.vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小
为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
4.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,这样就不用每次都要开辟空间,只有当额外的空间被占满,才会再次开辟更大的空间。 不同的库采用不同的策略权衡空间的使用和重新分配。
5.与其它动态序列容器相比(deques, lists and forward_lists), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起lists和forward_lists统一的迭代器和引用更好。
1.2 vector的使用
1.2.1vector 的构造函数声明
1.2.2 vector迭代器的使用
如下图
1.2.3vector 的空间相关
size()计算的是有效数据个数,capacity()是计算ve开辟的空间大小,不断增添数据,size()就慢慢增大知道size()==capacity(),就会进行增容,vector的增容为两倍;
resize\resver的使用
通过ve.size()改变ve的有效数据个数,ve.reserve()改变空间大小;
也可以使用ve.size()来增容,并且初始化新增的空间;原本有效数据为5,现在增加到10,新增的被初始化为2.
1.2.4 vector的增删查改
删除操作,不会导致缩容,对于系统而言,时间优先于空间,如果要缩容,必然会进行开辟空间,复制数据,交换地址等操作,这些操作会浪费时间,所以即使开辟的空间被删除到只剩一个数据,capacity依然不会变。
在第一个迭代器位置放两个2。
在第三个迭代器位置放一个3。
用ve.empty()判断是否ve为空,空则返回0,不为空返回1。
2.1 vector迭代器问题
举例,在v中偶数数据前放一个110,但结果却是错误,原因就在于迭代器出现了问题。
当迭代器到2的位置时,要插入110,所以将后面的数据都后移了一位,插入数据后,pos++正好又来到2的位置,这时it迭代器失效,它的地址不在第一个迭代器和最后一个迭代器之间。
解决方案是,每次插入迭代器都有++一下;