STL源码剖析学习四:vector

本文详细介绍了vector容器的特点和使用方法,包括其动态空间管理机制、迭代器类型及数据结构等。此外,还介绍了vector的构造与管理过程,特别是如何通过push_back方法进行元素的添加及其背后的空间扩充机制。

vector和array的使用非常相似,区别是vector是动态空间,

随着新元素的介入,靠内部机制就可以自动扩充空间以容纳新元素

 

vector的迭代器:
由于vector维护的是一个线性空间,所以可以用普通指针作为迭代器。指针也具备随即存取能力,因此vector提供随机访问迭代器。

 

vector的数据结构:
线性连续空间。

用start和finish指向目前已经被使用的范围中的头尾,并且以迭代器end_of_storage指向整块连续空间(包括备用空间)的末尾。
vector实际分配的空间一定大于等于需要的空间,以备将来的扩充。capacity的概念。

 

vector的构造与管理:
vector缺省使用alloc作为空间配置器
并且定义了一个data_allocator为了方便以元素大小为单位配置空间。

vector(size_type n,const T& value)
{
    fill_initialize(n,value);
}
void fill_initialize(size_type n, const T& value)
{
    start = allocate_and_fill(n, value);
    finish = start + n;
    end_of_storage = finish;
}
iterator allocate_and_fill(size_type n, const T& x)
{
    iterator result = data_allocatoe::allocate(n);
    uninitialized_fill_n(result, n, x);
    return result;
}

 

当我们用push_back插入元素时,先检查是否还有备用空间,如果有则直接在备用空间上构造新元素
如果没有,就扩充空间(重新配置,移动数据,释放原空间):
1.配置大小为原来的两倍;
2.把原内容拷贝到新的空间中
3.构造新元素并插入
4.析构并释放原vector
5.调整迭代器指向新的vector

 

所谓动态增加大小并不是在原vector后面增加新的空间,而是以原来的两倍大小开辟新的空间,然后把原内容拷贝过来,然后再构造新的元素,并且释放原空间。
因此任何对于vector的操作,一旦引起空间的重新分配,指向原vector的所有迭代器都会失效。


另外,vector的容量只会自动扩大,不会自动缩小。

转载于:https://www.cnblogs.com/w0w0/archive/2012/04/21/2461618.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值