作者:winterTTr(转载请注明) 资料来源:《The C++ Standard Library》
vector是STL中最简单,也是最常用的一个标准容器之一了。
其实,他就是对动态数组的封装,然后对于insert等操作进行的时候,在空间不够的情况下,会自动进行空间扩充及内容拷贝等等。
这里简单总结一下接口,然后说几点注意问题
- size() vs capacity()
size函数返回的是当前数组中的实际存储的元素数量。
capacity返回的是,当前数组中已申请空间的大小,所以说 size() <= capacity()
- resize() vs reserve()
resize()重新分配数组的大小,让保证其不小于参数指定的数值。如果参数小于capacity(),会将多余数据清除掉(调用析构函数)。如果大于capacity()会重新分配空间并拷贝原始数据,同时,对于大于size()的部分,使用默认参数初始化。
但是reserve并不进行元素的初始化,而只是进行空间的分配。当然,如果原始数据需要copy,是会调用拷贝构造函数的。
PS: resize()是有默认参数的 ,类似于void resize( typename T t = T() )
下面以一个例子分析一下resize(),究竟会发生什么:
程序的结果如下:
2293536|default constructor
4074448|copy constructor from:2293536
2293536|destructor
push one item ==>
size() 1
capacity() 1
2293536|default constructor
4074576|copy constructor from:4074448
4074577|copy constructor from:2293536
4074448|destructor
2293536|destructor
push another item ==>
size() 2
capacity() 2
2293312|default constructor
4074577|destructor
2293312|destructor
resize 1 ==>
size() 1
capacity() 2
2293312|default constructor
4074448|copy constructor from:4074576
4074449|copy constructor from:2293312
4074450|copy constructor from:2293312
4074576|destructor
2293312|destructor
resize 3 ==>
size() 3
capacity() 3
4074448|destructor
4074449|destructor
4074450|destructor下面是一个分析的Sequence图:
好了,通过这几张图,我想你应该能比较详细的了解vector中空间的运作状况了。
- 下面转一些具体的操作
- 特别的使用
我们可以把vector当作原始数组来使用,但是要注意一点的是,当做地址使用的时候,不要使用v.begin()的iterator,虽然对于某些实现来说,这样使用是没有问题的,但是,这样并不通用,我们应该正确的使用方法是&v[0]
对于vector<bool>这种情况,STL的实现考虑到空间效率,并不是将一个真正的bool作为一个元素进行存储的,而是使用1bit来将空间缩小8倍,所以说,对于vector<bool>的使用,需要注意到这一点,当然,对于它也有一些自己特别的函数